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

hig*_*guy 7 c performance numerical

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

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

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

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

Gil*_*Gil 4

CPU 有缓存。

与 CPU 速度相比,对系统内存的访问速度较慢。这就是 CPU 具有高速缓存(由超快内存制成)的原因。

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

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

code都会data强制刷新缓存。因此,尺寸在这两种情况下都很重要。

例如:当您或 时Code 可能会生成缓存未命中。当您在 a 处加载 a 时,可能会产生缓存未命中。jumpcallData variableremote address

还有其他问题alignment会极大地影响速度,但没有什么比 CPU 缓存未命中成本更高(重新加载 CPU 缓存涉及 CPU 核心同步,这不是一件容易的任务:它可能需要大约 250 个 CPU 周期!)。

在不讨论特定于平台的细节的情况下,这就是可以说的。

结论:保持简单。而且小也是美的。

  • 我不认为可执行文件的大小和指令高速缓存未命中发生的频率之间存在简单(甚至可能不是复杂)的关系。如果有的话,这个答案并没有提供令人信服的论据。 (2认同)