我听说C语言的性能有很多方面需要注意:强制转换操作的速度较慢,函数调用也比较慢,二进制操作比普通操作要快得多,等等...
我知道这些东西可能跟硬件平台有关,而且编译器的优化也会产生很大影响,但我希望能够查看一份图表,以了解怎样才能编写高性能程序时应该注意什么,应该避免什么。是否存在这样一份图表(或者网站、书籍、其他资源)?
我听说C语言的性能有很多方面需要注意:强制转换操作的速度较慢,函数调用也比较慢,二进制操作比普通操作要快得多,等等...
我知道这些东西可能跟硬件平台有关,而且编译器的优化也会产生很大影响,但我希望能够查看一份图表,以了解怎样才能编写高性能程序时应该注意什么,应该避免什么。是否存在这样一份图表(或者网站、书籍、其他资源)?
我感觉你对这些很困惑。让我们解决一些你提出的谬论。
强制类型转换比普通赋值慢。
这实际上取决于你要进行的强制类型转换。对于不同的地址类型,强制类型转换其实是免费的,因为你只是对同一个值应用了不同的解释。将不同宽度的数值类型进行强制类型转换可能会慢一些(有时隐式地在赋值时完成),但仍然非常快。
函数调用很慢。
不完全正确。虽然函数调用不是免费的,但成本并不高,所以除非你有证据表明他们确实会影响性能,否则不应该避免使用函数调用。永远不要没有充分的理由就进行优化,并且证明优化可以帮助程序的性能(如果反复尝试优化而没有得到我想要的性能平衡,我会撤回此类优化)。
二元运算比普通运算快。
什么是“普通运算”?值得一提的是,加法和乘法都是二元运算。在现代硬件上,它们都非常快,因此应该让编译器自由处理这些运算。更重要的是,正确描述你在做什么。
现在,对于真正消耗性能的问题:
关注这些问题; 它们通常是软件变慢的地方。并且始终选择好的算法和数据结构。
read()
操作。堆分配速度更快,但你通常需要进行更多的分配;不要害怕使用堆分配,但它绝对不是免费的。 - Donal Fellows基本上,你提到的所有操作都非常非常快。除非你每秒钟要执行数百万次,否则不要过于担心替代方案之间的微小差异。
如果你的程序中有一个时间关键部分运行得太慢,那就对它进行分析,找出具体花费时间的地方,并确定哪些地方需要优化。
你从哪里听到这些事情的??在这个领域中所有“病毒式传播”的神话中,这可能是我听过的最惊人的一个。
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.
char
转换为double
。但仍然非常便宜。 - Donal Fellowsint
转换为unsigned int
),也可能是廉价的(例如,将signed char
符号扩展为int
),或者是昂贵的(例如,将float
转换为int
)。 - caf