【问题标题】:LD_BIND_NOW Can Make the Executable run Slower?LD_BIND_NOW 可以使可执行文件运行得更慢吗?
【发布时间】:2018-06-15 00:04:12
【问题描述】:

我很好奇一个可执行文件是否写得不好,它有很多死代码,在外部引用 1000 个函数(即 .so 文件),但在运行时实际上只有 100 个函数被调用,LD_BIND_NOW=1 会比LD_BIND_NOW 没有设置?因为Procedure Linkage Table会包含900个无用的函数地址?在内存占用和性能方面更糟(因为我不知道查找是否为 O(n))。

我正在尝试查看将 LD_BIND_NOW 设置为 1 是否有帮助(通过与未设置的 LD_BIND_NOW 进行比较):
1. 在延迟方面运行 24 x 5 的程序
2. 在我的情况下,节省 1 微秒被认为是很大的,因为在程序生命周期内执行的代码路径主要是处理来自 TCP/UDP/共享内存的传入消息,然后对它们进行一些计算; 所有这些代码路径都需要很短的时间(例如

LD_BIND_NOW=1 是否有助于启动时间对我来说并不重要。

【问题讨论】:

  • 非常不清楚的问题。您是否关心短期运行程序的总体执行时间?哪一个?你有那个可执行文件的源代码吗?为什么你真的在乎?请编辑您的问题以进行大量改进并提供背景和动机。最后,您是否进行了基准测试(例如使用time(1)?在大多数情况下,这根本不重要!
  • @BasileStarynkevitch 我的来源有 IP,所以不能在这里发帖……而且它就像 500K 行代码,所以没有必要发帖。基准测试确实是最准确的方法;但是,我的问题是针对我的情况(刚刚添加)得到一个一般性的答案,而不是通过逐行代码得到一个非常具体的答案。希望这可以澄清一些事情。
  • 参见this answer中的参考
  • 你的问题确实不清楚,一脸懵逼。尝试对您的程序进行概要分析和基准测试。否则,编辑您的问题 以改进它,或许可以提供一些 minimal reproducible example。我觉得您以错误的方式使用“程序执行”。在 Linux 上,它与 execve 相关。也许你的意思是在你的程序中执行一些代码(这是非常不同的)
  • @BasileStarynkevitch 我替换了“执行”以避免特定于 linux 的混淆。一个具体的最小示例很难,因为我的问题是一个一般性问题,即如果程序写得不好以至于有太多死代码,LD_BIND_NOW=1 是否可以减少程序中所有可能代码路径的执行时间。我只是在寻找一个普通的案例而不是一个特定的案例。

标签: c++ c linux system centos7


【解决方案1】:

在我的情况下节省 1 微秒被认为是很大的,因为程序的执行都很短(例如

这不太可能(或者你的意思是别的)。对execve(2)(用于启动程序的系统调用)的典型调用通常持续几毫秒。因此,程序在微秒内执行(从execve_exit(2))很少见(实际上是不可能的)。

我建议您的程序每秒启动次数不要超过几次。如果整个程序的生命周期确实很短(所以它的process 只持续了几分之一秒),您可以考虑一些其他方法(也许让服务器运行这些功能)。

LD_BIND_NOW 将影响(并减慢)启动时间(例如在动态链接器ld-linux(8) 中)。某些event loop 的稳态执行时间应该无关紧要(缓存效果除外)。

另请参阅this related answer 中的参考资料(针对不同问题),它们包含与您的问题相关的详细解释。

简而言之,LD_BIND_NOW 的设置不会显着影响在紧密事件循环中处理每个传入消息所需的时间。

在某些情况下,在共享库(包含 position-independent code)中调用函数可能会稍微慢一些(最多几个百分点,在 x86-64 上可能更慢)。您可以尝试静态链接,甚至可以考虑优化链接时间(即编译并链接所有代码-主程序和静态库-如果使用-flto -O2,则使用GCC)。

你可能已经积累了technical debt,你可能需要主要的code refactoring(这需要大量的时间和精力,你应该预算)。

【讨论】:

  • 感谢您的回答。我想我把你弄糊涂了。我试图通过说“24 x 5 运行”来明确程序的寿命很长,并且每次执行都很短。我刚刚用“执行”的定义更新了我的问题。抱歉,不清楚。
  • 在实践中,LD_BIND_NOW 在您的情况下并不重要
  • 我对 99% 的可执行文件使用的库使用静态链接。 -flto 是一个有趣的选项。几年前,我使用 -fwhole-program 和使用 GCC 4.6.x 的 -O3 尝试过一次,对于一个代码路径(我专门测量了它,因为它对我很重要),它比没有这些标志要慢。而且我觉得这些标志会优化一些代码路径,但会使一些代码路径变得更糟。毕竟,GCC 不知道哪些代码路径是重要的,所以当请求优化时,GCC 会尽力猜测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
相关资源
最近更新 更多