เคล็ดลับการเขียน Program ให้มีประสิทธิภาพ

27-มี.ค.-19

คัมภีร์เทพ IT

Johanne Andersen ซึ่งเป็นผู้เขียนบทความนี้ ได้อ่านหนังสือ Writing efficient programs ของ Jon Bentley แม้จะเป็นหนังสือที่ค่อนข้างเก่าที่เขียนไว้ตั้งแต่ปี 1982 แล้ว แต่มันก็ยังมีเทคนิคและเคล็ดลับที่น่าสนใจและนำไปใช้ได้อยู่เสมอ เธอจึงได้รวบรวมเคล็ดลับการเขียน Program ที่มีประสิทธิภาพ จากหนังสือเล่มนี้มาให้พวกเราอ่านและนำไปใช้งานกัน

ก่อนอื่น Bentley แนะนำให้เรามุ่งไปที่เขียน Program ที่ Clean ให้ได้ก่อนที่จะคิดเรื่องการ Optimize โดยคุณเข้าใจกฏ 3 ข้อด้านล่างนี้ก่อน:

1. เรื่องของ ประสิทธิภาพ ถือเป็นปัญหาใหญ่ในการเขียน Code

2. Code บางส่วนที่ถูก Modify เป็นปัยหา “คอขวด” ที่กระทบต่อประสิทธิภาพของ System โดยรวม

3. เราสามารถทำให้สิ่งต่างๆ เร็วขึ้นกว่าเดิม ได้โดยการเปลี่ยน Algorithm และ Data Structure ของ Program ที่เกี่ยวข้อง

ในที่นี้ จะไม่กล่าวถึงว่าจะใช้ Algorithms และ Data Structures ใดหรือควรใช้เมื่อใด เพราะมี Resource ที่น่าสนใจมากมายให้คุณได้ค้นหาได้จากอินเตอร์เน็ต แต่เราจะ Focus กันที่สิ่งสำคัญอื่นๆ กัน

เทคนิคพื้นฐาน

  • ทำให้ Code ง่ายขึ้น: Program ที่มีความรวดเร็วส่วนใหญ่มักเป็น Program ที่เรียบง่าย ดังนั้น จึงทำให้มันง่ายเข้าไว้ ที่มาของความซับซ้อนที่ส่งผลเสียมักเป็นเรื่อง ความไม่เข้าใจ Task และการ Optimize ทั้งที่มันอาจยังไม่จำเป็น
  • ทำให้ปัญหาง่ายขึ้น: เพื่อเพิ่มประสิทธิภาพของ Program เราควรลดความซับซ้อนของปัญหาที่จะต้องแก้ เช่น ทำไมถึงต้องเก็บค่าเยอะแยะมากมาย ในเมื่อคุณต้องการใช้งานค่าเพียงไม่กี่ค่าเท่านั้น เป็นต้น
  • จงหัดสงสัยอยู่เสมอ: ตั้งคำถามถึงความจำเป็นของแต่ละ Instruction ของ Time Critical ในส่วนของ Code และแต่ละ Field  ของ Space Critical ในเรื่องของ Data Structure
  • จัดเตรียมทุกอย่างล่วงหน้าไว้ก่อน: พยายามทำงานให้เสร็จในเวลาที่กำหนด ดังนั้น ถ้าเป็นไปได้พยายามทำงานให้จบเพียงครั้งเดียวเพื่อจะได้ไม่ต้องกลับมาทำมันซ้ำอีกในภายหลัง เช่น เก็บผลลัพธ์ที่คำนวณไว้ล่วงหน้า, กำหนดตัวแปรไว้ก่อนเท่าที่จะสามารถทำได้ และโดยทั่วไปเรามักจะย้าย Code จากสถานที่ที่จะถูก Execute หลายครั้ง ไปยังสถานที่ที่จะถูก Execute มันเพียงครั้งเดียวถ้าเป็นไปได้

ลดปัญหาที่เกิดจากการใช้ Loop

  • การคำนวณนอก Loop: หลีกเลี่ยงการคำนวณที่เกิดขึ้นภายใน Loop ทั้งที่สามารถทำภายนอก Loop ได้ สิ่งนี้เหมาะสมอย่างยิ่งสำหรับการคำนวณที่เกี่ยวข้องกับ Square Root และ Function ทางคณิตศาสตร์อื่นๆ ที่ต้องใช้การคำนวนเยอะๆ

  • การรวม Loop: หากมี 2 Loops ที่ทำงานในทำนองเดียวกันและต้องใช้ Element ชุดเดียวกัน ก็ลงรวมมันเข้าด้วยกันซะ (ถ้าทำได้)

เพิ่มความเร็ว Logic

กฎของ Logic มักจะต้องตัดในเรื่องของความชัดเจนและความแข็งแกร่งของ Code เพื่อเพิ่มความเร็ว ดังนั้น ควรใช้ด้วยความระมัดระวัง

  • ใช้ประโยชน์จากลักษณะพิเศษของพีชคณิต: หากคุณประเมินแล้วว่า Logical Expression ที่จะใช้ มันดูยุ่งยากซับซ้อน และคุณสามารถเปลี่ยนมาใช้นิพจน์เชิงพีชคณิตได้ ก็จงทำมันซะ โดยคุณสามารถนำกฏของเดอมอร์แกน (De Morgan's laws) มาประยุกต์ใช้ได้ เช่น จาก !A || !B ไปเป็น !(A /\ B) และสิ่งนี้ก็เหมาะสำหรับ Function ทางคณิตศาสตร์ อย่างเช่น Square Root หรือ Logarithms หากพวกมันสามารถใช้งานเชิงพีชคณิตได้และส่งผลดีกว่าในการคำนวน ก็แนะนำให้ใช้มันแทน

  • เรียงลำดับการ Test ให้เหมาะสม: ควรจัดเรียงลำดับการ Test ดังนั้น การ Test ที่ไม่ยากมากและประสบความสำเร็จได้ง่าย มักมาก่อนการ Test ที่ยากๆ และไม่ค่อยประสบความสำเร็จ ส่วนใหญ่มักใช้ใน If-else statements
  • การกำจัดตัวแปร Boolean: กำจัดตัวแปร Boolean โดยใช้ If-else statements สำหรับ 2 ค่าของ Boolean(True/False)

ค้นหาจุดที่สำคัญ

ใช้ Statistics และ Analysis Tools เพื่อหาว่า จุดที่สำคัญ ใน Program ของคุณมันอยู่ตรงไหน ลอง Focus การทำงานของคุณไปที่จุดสำคัญๆ เหล่านั้น เมื่อคุณสามารถแยกจุดสำคัญของ System ออกมาได้แล้ว นี่เป็นขั้นตอนที่คุณควรทำ:

  • ระบุ Code ส่วนที่จะต้องเปลี่ยนแปลงแก้ไข
  • เลือกกฎที่จะใช้กับพวกมัน ค้นหาว่ากฎใดเหมาะสมที่สุด วัดผลของการ Modify นั้น อาจไม่ได้มีการเปลี่ยนแปลงหรือส่งผลกระทบมากนัก หรือมันอาจมีแนวโน้มทำให้แย่ลงก็เป็นได้
  • จัดทำ Document ของผลลัพธ์ของ Program รวมถึง Description ทั้งของ Clean Code และของการ Modify ที่คุณทำ

เมื่อคุณ Modify Program ที่ถูกต้องแล้ว ให้ทำการ Test ให้ครอบคลุมมากที่สุดเพื่อให้แน่ใจว่าการเปลี่ยนแปลงเหล่านั้นไม่ได้ทำให้เกิด Bug ใหม่ขึ้นมา กฎทุกข้อสามารถส่งผลในทางตรงข้ามกับที่เราตั้งใจไว้ รวมทั้งลดเรื่องของประสิทธิภาพ ดังนั้น คุณควรตรวจสอบให้แน่ใจทุกครั้งว่า คุณไม่ได้ทำให้ Run Time แย่ลงหลังจากการ Modify

จงย้อนกลับไปดู Code ของคุณและลองกฎอื่นๆ ดูบ้าง หรือถ้าคุณต้องเลือกระหว่าง 2 กฎ ก็ให้เลือกกฎที่มีประสิทธิภาพในการทำงานสูงสุด แต่จงระวังว่าเรื่องการใช้มันมากจนเกินเหตุ หากการเพิ่มความเร็วนั้นไม่ได้ทำให้ประสิทธิภาพในการทำงานเพิ่มขึ้นมากและกลับทำให้ Code ยุ่งเหยิงมากขึ้น ก็ไม่ต้องใช้มัน

สำหรับการแก้ปัญหา โปรดจำไว้ว่า คุณสามารถใช้แนวทางและวิธีแก้ปัญหาของคนอื่นๆ ได้ บางครั้งก็ไม่จำเป็นต้องเสียเวลาคิดในสิ่งที่คนอื่นเคยทำหรือเจอมาก่อนแล้ว เพราะคนที่เก่งและเชี่ยวชาญ มักจะมี Solution ที่ดีและมีประสิทธิภาพกว่า

ที่มา:  https://medium.com/

 

 

รับตำแหน่งงานไอทีใหม่ๆ ด้วยบริการ IT Job Alert

 

อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ

เพิ่มเพื่อน

 

บทความล่าสุด