当我回答另一个人的问题时,我遇到了这个问题。编译器如何优化代码?像 const, ... 这样的关键字有帮助吗?除了 volatiles 和 inline 函数以及如何自己优化代码之外!
问问题
11420 次
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
于 2010-10-10T20:02:10.423 回答