我已将以下功能添加到现有的本机 C++ 应用程序中:
- 通过 LoadLibraryA(...) 加载第 3 方 DLL
- 通过 GetProcAddress(...) 从 DLL 中获取函数指针
- 该函数被调用
虽然这基本上可行(该函数被称为 alight 并产生预期的输出),但有一个主要问题:函数调用(在 3. 中)非常慢。执行时间超过 300 毫秒(!),而它应该小于 1 毫秒。
所以我创建了一个新的空白 C++ 应用程序并复制了代码。因此,步骤 1 到 3 的执行方式与其他应用程序完全相同。该函数执行相同的操作并产生相同的结果。但执行要快得多:正如预期的那样,不到 1 毫秒。
我还做了一些观察:
- 两个结果都是 100% 可重复的。
- 两个应用程序似乎具有相同的编译器/链接器设置。
- 线程/性能问题似乎不是问题,因为在这两个应用程序中,代码都是在 CPU 使用率非常低的情况下在主线程上执行的(其他情况不多)。结果也是可重复的,这排除了这些时间问题。
- 在我的第一个应用程序中,对 DLL 的每次调用至少需要 300 毫秒,而在另一个应用程序中则很快。因此,行为不限于单个功能。
- 如果我使用调试或发布版本没有区别。
- 应用程序和第 3 方 DLL 都是 32 位的。
所以现在我正在寻找一个想法,是什么导致两个应用程序在做完全相同的事情时表现得如此不同。