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

时间:2010-05-22 21:39:06

标签: c performance

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

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

6 个答案:

答案 0 :(得分:10)

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

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

如果您对英特尔架构(以及所有与英特尔兼容的CPU)的微优化感兴趣,请is a must read(PDF)。 Agner's website.

上有更多有趣的指南

答案 1 :(得分:9)

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

  

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

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

  

函数调用很慢。

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

  

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

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

现在,对于真正花费的事情:

  • I / O。
  • 内存分配。
  • 记忆副本。
  • 深度嵌套(或很长)循环。

密切注意那些;他们是软件通常变慢的地方。并且总是选择好的算法和数据结构。

答案 2 :(得分:2)

曾几何时,有一本名​​为 Efficient C 的书。稍后,有一本名​​为高效的C / C ++编程:更小,更快,更好的书。最近还有一个名为 Efficient C ++

所有这些都涵盖了许多你感兴趣的东西。前两个似乎绝版,第三个可能应该是绝版。为了保持正确和有意义,这样的图表可能必须每月更新一次。几乎所有你认为你在这些方面的东西都可能是错误的开始,而正确的小问题很可能很快就会出错。

例如,您仍然会经常看到建议,如果您关心性能,则应避免浮点数。有一次,这甚至是合理的 - 但是现在,一些CPU实际上通过将整数转换为浮点数来进行整数运算,进行数学计算,然后将结果转换回整数!在整个过程中使用浮点可以提高速度。

答案 3 :(得分:1)

基本上你提到的所有操作都非常非常快。除非你每秒钟做数百万次,否则不要过多担心替代品之间的微小差异。

如果你的程序的时间关键部分运行速度太慢,请对其进行分析,以找出确切花费的时间以及优化的合理位置。

答案 4 :(得分:1)

听到 这些事情在哪里?在这个领域“流行病毒”的所有神话中,这可能是我听过的最神奇的神话。

C尽可能接近机器语言,仍然是与机器无关的“高级”语言。

所有其他答案都是正确的。

我只会在实际软件(不是两页小程序)中添加过多的一般性,过度抽象,用火箭筒杀死苍蝇,这是导致性能不佳的绝对原因,即使每个最后的程序员都考虑他/她的解决方案“简单的”。

答案 5 :(得分:1)

  

我在C中听过很多关于表演的事情......

有人给了你一些非常奇怪的想法。我特别喜欢“二进制”和“正常”操作之间的区别。我认为对于计算机来说,二进制 是正常的。有人必须向我解释这种区别。

  

我想看一张图表来大致了解我应该做些什么,以及我应该避免编写高性能程序。

我在下面提供了一张图表。它假设您已经了解了Kernighan和Ritchie级别的C语言,这是C语言的经典教科书,也是您唯一需要的C语言(尽管其他语言很有用)。

    Have you read Jon Bentley's book "Programming Pearls"?  --no--> read it
             |
             | yes
             V
    Have you read Peter van der Linden's book 
    "Expert C Programming: Deep C Secrets"?                 --no--> read it
             |
             | yes
             V
    Have you learned how to use valgrind --tool=callgrind
    and the kcachegrind visualizer?                         --no--> learn them
             |
             | yes
             V
    Congratulations!  You are now equipped to write 
    reasonably efficient C programs.

Bentley的书中的大多数主题,尤其是算法,都值得在其他地方更深入地探讨。但是这张图表将是一种无痛且有趣的入门方式