10

当我回答另一个人的问题时,我遇到了这个问题。编译器如何优化代码?像 const, ... 这样的关键字有帮助吗?除了 volatiles 和 inline 函数以及如何自己优化代码之外!

4

3 回答 3

12

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

我建议从编译器优化维基百科页面开始,因为在许多不同阶段执行了许多不同类型的优化。

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

于 2010-10-10T20:02:20.990 回答
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/磁盘/内存/

于 2010-10-10T19:59:22.367 回答
-5

优化规则:

  1. 不要这样做
  2. 仅限高级用户:不要这样做

编辑:可以在 CodingHorror 文章中找到引用(和其他信息,有用与否): 硬件很便宜,程序员很贵。不过,很高兴找到这个短语/引用的“起源”。

于 2010-10-10T20:02:10.423 回答