【问题标题】:Overhead of DLL function callDLL 函数调用的开销
【发布时间】:2011-11-09 18:15:38
【问题描述】:

从 DLL 调用函数时性能损失有多大?加载 DLL 对我们来说不是问题,调用我们的 highperf 库的次数不会很大。

大约,一次调用会接管多少个指令/时钟周期?

【问题讨论】:

标签: c++ c performance dll


【解决方案1】:

我的答案基于 Linux/glibc/ELF 动态链接器的工作方式,但我认为其他平台的总体答案是相同的:

对动态加载符号的第一次调用和下一次调用之间存在差异。第一次调用很昂贵,可能涉及许多周期。所有其他调用或多或少都在 1 - 2 条指令之外。

它的工作方式是链接器在过程链接表中设置一个条目,该条目从全局偏移表中获取该外部函数的地址。首先调用 GOT 的地址指向一个存根,该存根运行动态链接器来解析 DLL 中函数的真实地址。这可能需要很多周期,但是一旦完成一次,动态链接器将路径 GOT 条目直接指向函数,因此下次调用 PLT 代码时将直接调用函数。

这里有一个链接,可以很好地了解这个过程:http://www.technovelty.org/linux/pltgot.html

【讨论】:

  • 在 Windows 上的 DLL 中,所有工作都由加载器在模块加载时完成。
  • 我相信只有当 DLL 不是用 LoadLibrary 动态加载时才会这样。
  • @Tamas:为什么?因为我们需要运行时加载。
  • @Tamás Szelei 是的,当您使用 LoadLibrary 时,加载它会产生成本,然后每次调用 GetProcAddress 时都会多付一些费用
  • @James,如果您在 PE 标头中有 DLL,win32 PE 加载程序将在运行时加载您的 DLL(正如大卫建议的那样,在开始执行之前)。如果动态加载库,则使用 GetProcAddress 获取函数指针,从那时起,它的开销与其他情况几乎相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
相关资源
最近更新 更多