我很好奇一个可执行文件写得不好,它有很多死代码,在外部引用了1000个函数(即.so文件),但是在运行时实际上只调用了100个这些函数,LD_BIND_NOW = 1比未设置LD_BIND_NOW更糟糕?因为过程链接表将包含900个无用的函数地址?从内存占用和性能的 Angular 来看更糟(因为我不知道查找是否为O(n))。
我试图查看将LD_BIND_NOW设置为1是否有帮助(与未设置的LD_BIND_NOW进行比较):
1.按延迟运行24 x 5的程序
2.在我的情况下,节省1微秒被认为是很大的,因为在程序生存期内执行的代码路径主要是处理来自TCP / UDP /共享内存的传入消息,然后对它们进行一些计算;
所有这些代码路径都需要很短的时间(例如
LD_BIND_NOW = 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上可能更少)。您可以尝试静态链接,甚至可以考虑链接时间优化(即,如果使用GCC,则将所有代码-主程序和静态库-编译并链接到-flto -O2
)。
您可能已经积累了technical debt,并且可能需要主要的code refactoring(这需要花费很多时间和精力,因此您应该进行预算)。
关于c++ - LD_BIND_NOW可以使可执行的运行速度变慢吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48109146/