答案 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)
优化规则:
编辑: 引用(和其他信息,有用与否)可以在CodingHorror文章中找到: Hardware is cheap, programmers are expensive。不过可以找到这句话/引用的“起源”。