调用DLL函数时会出现性能损失吗?对我们来说,加载DLL不是问题,我们高性能库的调用次数也不会很多。
大约一次DLL函数调用需要多少条指令/时钟周期,相比静态库调用呢?
调用DLL函数时会出现性能损失吗?对我们来说,加载DLL不是问题,我们高性能库的调用次数也不会很多。
大约一次DLL函数调用需要多少条指令/时钟周期,相比静态库调用呢?
我的答案是基于Linux/glibc/ELF动态链接器的工作方式,但我认为其他平台的总体答案也是相同的:
第一次调用动态加载的符号与后续调用之间存在差异。第一次调用很昂贵,可能需要很多周期。所有其他调用都更多或少距离1-2个指令。
它的工作原理是链接器在过程链接表中设置一个条目,该条目从全局偏移表中获取那个外部函数的地址。在首次调用时,GOT的地址指向运行动态链接器以解析DLL中函数的实际地址的存根。这可能需要很多周期,但是一旦完成一次,动态链接器将修改GOT条目的路径,直接指向该函数,因此下一次调用PLT代码时将直接调用该函数。
这里是一个非常好的演示该过程的链接:http://www.technovelty.org/linux/pltgot.html