当我回答另一个人的问题时,遇到了这个问题。编译器如何优化代码?像const这样的关键字是否有帮助?除了使用volatile和inline函数以及如何自己优化代码之外。
当我回答另一个人的问题时,遇到了这个问题。编译器如何优化代码?像const这样的关键字是否有帮助?除了使用volatile和inline函数以及如何自己优化代码之外。
编译器可自由优化代码,只要能保证代码的语义不变。
我建议从编译器优化维基百科页面开始,因为有许多不同类型的优化在许多不同阶段执行。
正如您所看到的,现代编译器非常“聪明”,可以优化代码(编译的C代码通常比手写汇编代码更快,除非程序员真的知道如何利用所有特定处理器指令和怪癖)。就像其他人所说的,首先基于良好的设计编写清晰易懂的代码。
除了编译器可以为您执行的操作之外,您可以做的一件非常重要的事情是了解缓存。由于访问内存真的很费时间,缓存试图通过存储不仅是您所访问的数据,而且是附近元素来帮助您。这就是为什么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的文章。
编辑:将“磁盘”替换为“内存”。
array[row][col]
是对最初存储在硬盘上的主存储器的调用。由于硬盘移动速度比CPU慢得多,因此计算机会将信息存储在一个“缓存”中,以便更容易地访问它。 - Alex Reece