编译器如何优化我们的代码?

时间:2010-10-10 19:54:00

标签: c++ c optimization compiler-construction compiler-optimization

当我回答另一个人的问题时,我遇到了这个问题。编译器如何优化代码? const,...等关键字可以帮忙吗?除了挥发性和内联函数以及如何通过自己优化代码之外的事实!

3 个答案:

答案 0 :(得分:11)

编译器可以自由地优化代码,只要它们可以保证代码的语义不会改变。

我建议从Compiler optimization维基百科页面开始,因为在许多不同阶段都有许多不同类型的优化。

正如您所看到的,现代编译器在优化代码时非常'聪明'(编译的C代码通常比手写编译快,除非程序员真的知道如何利用所有特定的处理器指令和怪癖)。正如其他人所说的那样,首先要根据良好的设计来写清楚。

答案 1 :(得分:6)

你可以做的一件非常重要的事情(超出编译器可以为你做的事情)就是要知道缓存。由于访问内存非常耗时,因此缓存会尝试不仅存储您访问它的数据,还会存储附近的元素。这就是为什么foo的运行速度比bar快得多:

array[ NUM_ROWS ][ NUM_COLS ];

foo() 
{
    int row, col;
    int sum = 0;

    // accesses the elements in the array continuously
    for ( row = 0; row < NUM_ROWS ; row++ ) 
    {
         for ( col = 0; col < NUM_COLS; col++ )
         {
              sum += array[ row ][ col ];
         }
    }
}

bar() 
{
    int row, col;
    int sum = 0;

    // skips from row to row ( big jumps that might miss the cache )
    for ( col = 0; col < NUM_COLS ; col++ ) 
    {
         for ( row = 0; row < NUM_ROWS; row++ )
         {
              sum += array[ row ][ col ];
         }
    }
}

修改 另一件要注意的事情是重复字符串连接。错了,这可能使O( n )中似乎运行的代码实际上在O( n^2 )中 - 请参阅Joel on Software上的文章

编辑: s / disk / memory /

答案 2 :(得分:-4)

优化规则:

  1. 不要这样做
  2. 仅限高级用户:尚未执行此操作
  3. 编辑: 引用(和其他信息,有用与否)可以在CodingHorror文章中找到: Hardware is cheap, programmers are expensive。不过可以找到这句话/引用的“起源”。