编译器优化级别可以显著影响代码的性能和大小。不同的优化级别在编译过程中应用不同的优化技术,从而提高程序的执行效率或减少代码的体积。以下是常见的优化级别及其作用:

1. 无优化(-O0)

  • 不进行任何优化。
  • 保持代码和调试信息的最大一致性。

优点:

    缺点:

    • 生成的代码执行效率低,可能包含大量冗余指令。

    2. 优化级别 -O1 或 -O(优化级别1)

    • 启用一些基本的优化技术,提高程序的运行效率,同时尽量保持编译速度。

    优化内容:

      优点:

      • 在提高性能的同时,编译时间不会显著增加。

      • 优化效果不如更高级别的优化。

      3. 优化级别 -O2(优化级别2)

      作用:

        优化内容:

        • 除了-O1的优化外,还包括更多的循环优化、函数内联、代码移动等。
        • 更激进的常量折叠和传播。
        • 更复杂的控制流和数据流优化。

        • 生成的代码性能较高。

        缺点:

          4. 优化级别 -O3(优化级别3)

          作用:

          • 在-O2的基础上,启用更激进的优化技术,追求最高的执行效率。

          优化内容:

          • 除了-O2的优化外,还包括更多的循环展开、函数内联、指令调度等。
          • 可能进行跨文件优化。

          优点:

          • 生成的代码性能最高。

          缺点:

          • 编译时间和内存消耗进一步增加。
          • 有可能引入一些不确定的行为。

          作用:

          • 在-O3的基础上,启用一些不符合标准的优化,以最大限度地提高性能。

          • 除了-O3的优化外,还包括允许违反严格的标准遵从性来进行优化(例如禁用浮点运算的严格标准)。

          优点:

            缺点:

            • 有可能引入一些不符合标准的行为,导致代码的可移植性和稳定性下降。

            实验和比较

            测试代码示例

            #include <iostream>
            #include <vector>
            #include <chrono>
            
            void testLoop(std::vector<int>& array) {
                for (int i = 0; i < array.size(); ++i) {
                    array[i] = array[i] * 2;
                }
            }
            
            int main() {
                const int arraySize = 1000000;
                std::vector<int> array(arraySize, 1);
            
                auto start = std::chrono::high_resolution_clock::now();
                testLoop(array);
                auto end = std::chrono::high_resolution_clock::now();
                std::chrono::duration<double> elapsed = end - start;
            
                std::cout << "Elapsed time: " << elapsed.count() << " seconds" << std::endl;
            
                return 0;
            }
            

            g++ -O0 -o test_O0 test.cpp
            g++ -O1 -o test_O1 test.cpp
            g++ -O2 -o test_O2 test.cpp
            g++ -O3 -o test_O3 test.cpp
            g++ -Ofast -o test_Ofast test.cpp
            
            ./test_O0
            ./test_O1
            ./test_O2
            ./test_O3
            ./test_Ofast
            

            通过比较不同优化级别下程序的执行时间,可以直观地看到优化级别对性能的影响。