ในวันแรกของ gcc (2.8 ฯลฯ ) และในช่วงเวลาของ egcs และ redhat 2.96 -O3 ค่อนข้างบั๊กกี้บางครั้ง แต่นี่เป็นเวลากว่าทศวรรษที่ผ่านมาและ -O3 ไม่แตกต่างจากการเพิ่มประสิทธิภาพระดับอื่น ๆ (ในรถ)
อย่างไรก็ตามมีแนวโน้มที่จะเปิดเผยกรณีที่ผู้คนใช้พฤติกรรมที่ไม่ได้กำหนดเนื่องจากต้องอาศัยกฎเกณฑ์อย่างเข้มงวดมากขึ้นและโดยเฉพาะอย่างยิ่งกรณีมุมของภาษา
ในฐานะที่เป็นบันทึกย่อส่วนตัวฉันกำลังใช้งานซอฟต์แวร์การผลิตในภาคการเงินเป็นเวลาหลายปีในขณะนี้ด้วย -O3 และยังไม่พบข้อผิดพลาดที่จะไม่เกิดขึ้นถ้าฉันจะใช้ -O2
ตามความต้องการที่เป็นที่นิยมเพิ่มที่นี่:
-O3 และโดยเฉพาะอย่างยิ่งการตั้งค่าสถานะเพิ่มเติมเช่น -Funroll-loops (ไม่ได้เปิดใช้งานโดย -O3) บางครั้งสามารถนำไปสู่การสร้างรหัสเครื่องเพิ่มเติม ภายใต้สถานการณ์บางอย่าง (เช่นใน cpu ที่มีแคชคำสั่ง L1 ขนาดเล็กเป็นพิเศษ) สิ่งนี้อาจทำให้เกิดการชะลอตัวเนื่องจากรหัสทั้งหมดเช่นบางวงในตอนนี้ไม่เหมาะสมใน L1I อีกต่อไป โดยทั่วไปแล้ว gcc พยายามอย่างหนักที่จะไม่สร้างรหัสมากนัก แต่เนื่องจากโดยทั่วไปแล้วจะเป็นการเพิ่มประสิทธิภาพของกรณีทั่วไปจึงสามารถเกิดขึ้นได้ ตัวเลือกโดยเฉพาะอย่างยิ่งมีแนวโน้มที่จะนี้ (เช่นการยกเลิกการวนรอบ) มักจะไม่รวมอยู่ใน -O3 และมีการทำเครื่องหมายตามใน manpage ดังนั้นจึงเป็นความคิดที่ดีที่จะใช้ -O3 ในการสร้างรหัสอย่างรวดเร็วและถอยกลับไปที่ -O2 หรือ -Os (ซึ่งพยายามปรับขนาดรหัสให้เหมาะสม) เมื่อเหมาะสม (เช่นเมื่อ profiler ระบุว่า L1I คิดถึง)
หากคุณต้องการเพิ่มประสิทธิภาพสูงสุดคุณสามารถปรับเปลี่ยน gcc ผ่านทาง - เปรียบเทียบค่าใช้จ่ายที่เกี่ยวข้องกับการปรับให้เหมาะสมบางอย่าง นอกจากนี้โปรดทราบว่าตอนนี้ gcc มีความสามารถในการใส่คุณลักษณะที่ฟังก์ชั่นที่ควบคุมการตั้งค่าการเพิ่มประสิทธิภาพเฉพาะสำหรับฟังก์ชั่นเหล่านี้ดังนั้นเมื่อคุณพบว่าคุณมีปัญหากับ -O3 ในหนึ่งฟังก์ชั่น คุณไม่จำเป็นต้องรวบรวมไฟล์ทั้งหมดหรือแม้แต่โครงการทั้งหมดด้วย O2
ดูเหมือนว่าจะต้องใช้ความระมัดระวังเมื่อใช้ -Ofast ซึ่งระบุว่า:
- รวดเร็วเปิดใช้งานการปรับให้เหมาะสมทั้งหมด -O3 นอกจากนี้ยังเปิดใช้งานการปรับให้เหมาะสมที่ไม่ถูกต้องสำหรับโปรแกรมที่เป็นไปตามมาตรฐานทั้งหมด
ซึ่งทำให้ฉันสรุปได้ว่า -O3 มีวัตถุประสงค์เพื่อให้เป็นไปตามมาตรฐานอย่างสมบูรณ์