C:分配,二进制操作等的性能

Suu*_*aku 5 c performance

我在C中听说过很多关于性能的事情; 与正常分配相比,转换速度慢,函数调用很慢,二进制操作比正常操作快得多,等等......

我确信其中一些内容是特定于架构的,编译器优化可能会产生巨大的差异,但我希望看到一个图表来大致了解我应该做什么以及我应该避免编写高性能程式.有这样的图表(或网站,书籍,任何东西)?

Yan*_*min 10

基本上没有.从语法层面来看,没有这样的"技巧和窍门"一书,因为没有肯定的保证你说的任何事情都是真的(事实上,大多数都是假的).

通常,性能调优应该更多地关注算法,然后是内存局部性和缓存优化.您将拥有的最佳工具是分析器(oprofile,valgrind,cachegrind等),然后了解机器架构(指令组合,这些组合是次优的,对齐限制,内存层次结构和大小)以及CPU的汇编语言(捕获小于最佳内循环问题).

如果您对英特尔架构(以及所有与英特尔兼容的CPU)的微优化感兴趣,则必须阅读(PDF).Agner网站上有更多有趣的指南.


Don*_*ows 9

在我看来,你对这一切感到非常困惑.让我们来谈谈你拖累的一些神话.

与正常作业相比,施法速度较慢.

这真的取决于你的演员阵容.在不同的地址类型之间,没有; 因为你只是对同一个值应用不同的解释,所以实际上是免费的.数字类型的不同宽度之间的转换可能会慢一些(有时在赋值时隐式完成)但仍然非常快.

函数调用很慢.

并不是的.它们不是免费的,但是成本不够高,你应该避免使用它们,除非你有分析数据说不然.在没有充分理由的情况下永远不要优化,并证明它会有所帮助.(据我所知,我已经知道可以恢复未达到我想要的性能提升平衡的尝试优化.)

二进制操作比正常操作更快.

什么是"正常运作"?FWIW,另外是二进制操作.乘法也是如此.在现代硬件上,它们都非常快.让编译器担心这一点.重点是描述你正在做的事情,这一点更为重要.

现在,对于真正花费的东西:

  • I/O.
  • 内存分配.
  • 记忆副本.
  • 深度嵌套(或非常长)的循环.

留意那些; 他们是软件通常变慢的地方.并始终选择好的算法和数据结构.