二进制文件的大小如何影响执行速度

时间:2012-10-17 15:06:01

标签: c performance numerical

二进制文件的大小如何影响执行速度?具体来说,我说的是用ANSI-C编写的代码,使用gnu或intel编译器翻译成机器语言。二进制文件的目标平台是具有运行Linux操作系统的intel或AMD多核CPU的现代计算机。代码可能使用openMP并行执行数值计算,二进制文件可能有几兆字节。

请注意,执行时间在任何情况下都要比加载代码和库所需的时间大得多。我想到了非常具体的代码,用于解决大型常微分方程系统,用于模拟动力学方程,这些方程通常受中等系统大小的CPU约束,但也可能成为存储器限制。

我在问小二进制大小是否应该是高效代码的设计标准,或者我是否总能优先考虑显式代码(最终重复可以实现为函数的代码块)和编译器优化,例如循环展开等

我知道分析技术以及如何将它们应用于特定问题,但我想知道在何种程度上可以做出一般性陈述。

2 个答案:

答案 0 :(得分:3)

CPU只执行代码的一部分,因此它是代码的内容,以及它内部移动的程度,决定了速度。

如果你有10Mb的代码,并且第一个9Mb只在启动时执行一次,那么9Mb是否很慢,或者它是90Mb还是90kb并不重要。如果CPU花费99.99%的时间在一些小而紧凑的循环中进行一些非常有效的计算,那么它将会很快,如果它必须一次又一次地运行100,000行代码,它可能会慢得多。

优化是关于查看CPU花费大部分时间的位置,并使得代码尽可能高效地获得答案所需的CPU周期数。有时这可能意味着在其外部添加一些额外的“准备”代码,以使主要部分的工作更容易/更快。

在某些系统中,二进制大小是主要关注点(EG嵌入式设备),但在其他系统中,它几乎完全无关。

另请参阅:http://www.codeproject.com/Articles/6154/Writing-Efficient-C-and-C-Code-Optimization

答案 1 :(得分:2)

CPU有缓存。

与CPU速度相比,对系统内存的访问速度很慢。这就是为什么CPU有缓存(由超快速内存组成)。

每个级别的CPU缓存都有不同的大小和速度。

因此,要实现最大可能的速度,在最低级别避免缓存刷新至关重要(不幸的是,这也是最小的缓存)。

codedata都会强制刷新缓存。所以这两种情况都很重要。

例如:Code 可能jumpcall时生成缓存未命中。在Data加载variable时,remote address 可能会生成缓存未命中。

还有其他问题,例如alignment可以极大地影响速度,但没有任何成本比CPU缓存未命中(重新加载CPU缓存涉及CPU内核同步,这不是一件容易的事:它可能需要像250个CPU周期!)。

没有进入特定于平台的细节,这就是可以说的。

结论:保持简单。小而美。

相关问题