ทำการออปติไมซ์แบบท้องถิ่นทำให้ชัดเจนจัดทำเอกสารได้ดีและทำให้ง่ายต่อการเปรียบเทียบเวอร์ชันที่ได้รับการปรับปรุงซึ่งกันและกันและกับเวอร์ชันที่ไม่ได้เพิ่มประสิทธิภาพทั้งในแง่ของซอร์สโค้ดและประสิทธิภาพรันไทม์
คำตอบแบบเต็ม
หากการปรับให้เหมาะสมดังกล่าวมีความสำคัญต่อผลิตภัณฑ์ของคุณจริงๆแล้วคุณไม่จำเป็นต้องรู้ว่าทำไมการปรับให้เหมาะสมนั้นมีประโยชน์มาก่อน แต่ยังให้ข้อมูลที่เพียงพอเพื่อช่วยให้นักพัฒนาทราบว่าพวกเขาจะมีประโยชน์ในอนาคตหรือไม่
เป็นการดีที่คุณจะต้องทำการทดสอบประสิทธิภาพในกระบวนการสร้างของคุณดังนั้นคุณจะพบว่าเมื่อใดที่เทคโนโลยีใหม่ ๆ
โปรดจำไว้ว่า:
กฎข้อแรกของการเพิ่มประสิทธิภาพโปรแกรม: อย่าทำ
กฎข้อที่สองของการเพิ่มประสิทธิภาพโปรแกรม (สำหรับผู้เชี่ยวชาญเท่านั้น!): อย่าเพิ่งทำ "
- Michael A. Jackson
เพื่อให้ทราบว่าขณะนี้เป็นเวลาที่ต้องมีการเปรียบเทียบและการทดสอบ
ดังที่คุณกล่าวถึงปัญหาที่ใหญ่ที่สุดของโค้ดที่ได้รับการปรับให้เหมาะสมที่สุดคือมันยากที่จะรักษาไว้ดังนั้นเท่าที่จะทำได้คุณต้องแยกส่วนที่ปรับให้เหมาะสมออกจากส่วนที่ไม่ได้เพิ่มประสิทธิภาพ ไม่ว่าคุณจะทำสิ่งนี้ผ่านการเชื่อมโยงเวลาคอมไพล์การเรียกใช้ฟังก์ชันเสมือนรันไทม์หรือบางสิ่งในระหว่างนั้นไม่ควรสำคัญ สิ่งที่สำคัญคือเมื่อคุณทำการทดสอบคุณต้องการทดสอบกับทุกเวอร์ชันที่คุณสนใจในปัจจุบัน
ฉันอยากจะสร้างระบบในลักษณะที่รหัสการผลิตขั้นพื้นฐานแบบไม่สามารถจับเวลาได้สามารถใช้เพื่อทำความเข้าใจเจตนาของรหัสได้จากนั้นสร้างโมดูลที่ปรับให้เหมาะสมที่สุดควบคู่ไปกับสิ่งนี้ซึ่งประกอบด้วยรุ่นหรือรุ่นที่เหมาะสมที่สุด รุ่นที่ได้รับการปรับให้เหมาะสมที่สุดนั้นแตกต่างจากสายพื้นฐาน เมื่อคุณรันการทดสอบ (หน่วยและการรวม) คุณจะรันในเวอร์ชันที่ไม่ได้เพิ่มประสิทธิภาพและในโมดูลที่ปรับให้เหมาะสมปัจจุบันทั้งหมด
ตัวอย่าง
ตัวอย่างเช่นสมมติว่าคุณมีฟังก์ชั่นการแปลงฟูริเยร์ที่รวดเร็ว บางทีคุณอาจมีพื้นฐานการดำเนินงานในอัลกอริทึมและการทดสอบในfft.c
fft_tests.c
แล้วก็ไปตามมา Pentium และคุณตัดสินใจที่จะใช้รุ่นจุดคงที่ในfft_mmx.c
การใช้คำแนะนำ MMX ต่อมา Pentium 3 มาพร้อมและคุณตัดสินใจที่จะเพิ่มรุ่นที่ใช้Streaming SIMD ส่วนขยายfft_sse.c
ใน
ตอนนี้คุณต้องการเพิ่มCUDAดังนั้นคุณเพิ่มfft_cuda.c
แต่พบว่าด้วยชุดข้อมูลทดสอบที่คุณใช้มานานหลายปีรุ่น CUDA จะช้ากว่ารุ่น SSE! คุณทำการวิเคราะห์และจบลงด้วยการเพิ่มชุดข้อมูลที่ใหญ่กว่า 100 เท่าและคุณจะได้ความเร็วที่คุณคาดหวัง แต่ตอนนี้คุณรู้แล้วว่าเวลาตั้งค่าสำหรับการใช้รุ่น CUDA นั้นมีความสำคัญและชุดข้อมูลขนาดเล็กคุณควรใช้ อัลกอริทึมที่ไม่ต้องเสียค่าติดตั้ง
ในแต่ละกรณีเหล่านี้คุณกำลังใช้อัลกอริทึมเดียวกันทั้งหมดควรทำงานในลักษณะเดียวกัน แต่จะทำงานด้วยประสิทธิภาพและความเร็วที่แตกต่างกันในสถาปัตยกรรมที่แตกต่างกัน (หากพวกเขาจะทำงานเลย) จากมุมมองโค้ดคุณสามารถเปรียบเทียบคู่ซอร์สไฟล์ใด ๆ เพื่อค้นหาว่าทำไมอินเทอร์เฟซเดียวกันจึงถูกนำไปใช้งานในรูปแบบที่แตกต่างกันและโดยทั่วไปวิธีที่ง่ายที่สุดคือการอ้างอิงกลับไปยังเวอร์ชันที่ไม่มีการกำหนดเวลาดั้งเดิม
เหมือนกันทั้งหมดสำหรับการใช้งาน OOP ที่คลาสพื้นฐานซึ่งใช้อัลกอริทึมที่ไม่ได้เพิ่มประสิทธิภาพและคลาสที่ได้รับจะใช้การเพิ่มประสิทธิภาพที่แตกต่างกัน
สิ่งที่สำคัญคือเพื่อให้สิ่งเดียวที่เหมือนกันเพื่อให้ความแตกต่างที่เห็นได้ชัด