【问题标题】:I should avoid static compilation because of cache miss?由于缓存未命中,我应该避免静态编译吗?
【发布时间】:2013-06-15 16:02:11
【问题描述】:

标题几乎概括了整个故事,我是reading this,关键是

更大的可执行文件意味着更多的缓存未命中

由于静态可执行文件的定义大于动态链接的可执行文件,我很好奇这种情况下的实际考虑因素是什么。

【问题讨论】:

    标签: c++ g++ static-linking


    【解决方案1】:

    链接中的文章讨论了在操作系统内核中内联小函数的副作用。这确实对性能产生了明显的影响,因为在整个系统调用序列中,从许多不同的地方调用了相同的函数——例如,如果你调用open,然后调用readseekwrite , open 将在内核的某处存储一个文件句柄,并且在对readseekwrite 的调用中,必须“找到”该句柄。如果这是一个内联函数,我们现在在缓存中拥有该函数的三个副本,而 read 调用与 seekwrite 相同的函数完全没有任何好处。如果是“非内联”函数,当seekwrite 调用该函数时,它确实会在缓存中准备好。

    对于给定的进程,无论是静态链接还是动态链接,一旦应用程序完全加载,影响很小。如果应用程序有很多副本,那么其他进程可能会受益于为共享库重用相同的内存。但是该进程所需的大小保持不变,无论它与 0、1、3 还是 100 个其他进程共享。在许多可执行文件之间共享二进制文件的好处来自于系统中几乎每个可执行文件背后的 C 库之类的东西 - 因此,当您在系统中运行 1000 个进程时,所有进程都使用相同的基本运行时系统,有只有一份而不是 1000 份代码。但它不太可能对任何特定应用程序的缓存效率产生太大影响——也许像strcpy 之类的常用函数被使用得足够频繁,以至于当操作系统任务切换时,它仍然在缓存中的可能性很小下一个应用程序执行strcpy

    所以,总而言之:可能根本没有任何区别。

    【讨论】:

      【解决方案2】:

      静态版本的整体内存占用与动态版本相同;请记住,动态链接的对象仍然需要加载到内存中!

      当然,人们也可以争辩说,如果有多个进程在运行,并且它们都动态链接到同一个对象,那么内存中只需要一个副本,因此总占用空间比它们都静态的要低链接。

      [免责声明:以上所有内容都是有根据的猜测;我从未测量过链接对缓存行为的影响。]

      【讨论】:

      • 如果你这样说,看起来静态和动态链接在你的代码运行时是一回事......
      猜你喜欢
      • 2010-11-21
      • 2016-04-29
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 2018-06-16
      • 2016-12-22
      相关资源
      最近更新 更多