我可以获得一系列常见的C++优化实践吗?
我的意思是优化是你必须修改源代码才能更快地运行程序,而不是改变编译器设置.
我将回应别人所说的话:一个更好的算法将在性能提升方面取胜.
也就是说,我从事图像处理工作,作为一个问题领域可能会更加棘手.例如,很多年前我有一大堆代码看起来像这样:
void FlipBuffer(unsigned char *start, unsigned char *end) { unsigned char temp; while (start <= end) { temp = _bitRev[*start]; *start++ = _bitRev[*end]; *end-- = temp; } }
它将1位帧缓冲器旋转180度._bitRev是256字节的反转位表.这段代码就像你能得到的一样严密.它采用8MHz 68K激光打印机控制器,大约需要2.5秒才能完成一张合法大小的纸张.为了省去细节,客户无法忍受2.5秒.解决方案是与此相同的算法.不同之处在于
我用128K表操作单词而不是字节(68K在单词上更快乐)
我使用Duff的设备来展开循环,就像在一个短分支中一样
我进行了优化以跳过空白单词
我最后在汇编中重写它以利用sobgtr指令(减去一个并在更大的分支上)并在正确的位置具有"自由"后增量和预减量.
所以5x:没有算法改变.
关键是您还需要了解您的问题域以及瓶颈意味着什么.在图像处理中,算法仍然是王道,但如果你的循环正在做额外的工作,那么将这项工作乘以数百万,这就是你支付的价格.
编写更好程序的两种方法:
充分利用语言
代码由Steve McConnell完成
有效的C++
特殊的C++
描述你的申请
确定哪些代码区域占用了多少时间
看看你是否可以使用更好的数据结构/算法来加快速度
人们可以做的语言没有太多优化 - 它仅限于使用语言结构(从#1学习).主要好处来自上面的#2.
不要忘记一些事情:
- "我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源." (c)Donald Knuth
- 如果我们优化算法而不是代码,我们可以得到更多.
- 我们将仅优化现有代码的慢速部分,这些部分将由分析器或其他特殊工具检测到.
Agner Fog在分析几个关于C++结构的编译器的输出方面做得很好.你会在这里找到他的作品:http://www.agner.org/optimize/.
英特尔也提供了一个很棒的文档 - "英特尔®64和IA-32架构优化参考手册",您可以在http://www.intel.com/products/processor/manuals/index.htm找到它.虽然它主要针对IA-32架构,但它包含可应用于大多数平台的一般建议.显然,它和Agner Fog的指南确实相交了一点.
正如其他答案中所提到的,在分析和算法选择之后,微优化显然是您想要使程序更快的最后一步.
您可能对此感兴趣:优化C++ Wikibook