我注意到我的程序有一些奇怪的行为。我使用 Visual Studio Professional 2013 Update 1 用 C++ 编写它,它由一个 exe 应用程序组成,该应用程序链接多个 DLL 并调用这些 DLL 中定义的函数。
在我的主程序(由数千行代码组成)中,我调用了一个 DLL 函数(我们称其为DLLFunction()
)然后我计算该调用所花费的时间,如下所示:
auto beginTime = std::chrono::high_resolution_clock::now();
DllFunction();
auto endTime = std::chrono::high_resolution_clock::now();
long long totalTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
我注意到,在 Visual Studio 之外启动它需要更长的时间。例如:
运行它debug在带有附加调试器的 Visual Studio 中 -->~50 ms
运行它release在 Visual Studio 中附带调试器--->~25 ms
运行它release在 Visual Studio 中没有附加调试器--->~20 ms
运行它outsideVisual Studio 的 (release构建)--->~80 ms
正如您所看到的,在 Visual Studio 之外的版本中运行它实际上比运行带有附加调试器的调试构建需要更长的时间!
有问题的 DLL 是由同一个编译器在同一解决方案中构建的,并且我已经仔细检查了启动应用程序的目录中的所有 DLL 都是正确的。
这种行为的原因可能是什么?
EDIT 5:
主应用程序生成另一个控制台应用程序并使用命名管道与其进行通信。事实证明,不生成另一个应用程序可以使 DLL 在 Visual Studio 之外快速调用。
然而,相同的应用程序在 Visual Studio 内部和外部生成,因此我不明白为什么它会减慢 Visual Studio 外部的其他调用。
EDIT 4:
事实证明,只有当我将函数调用放在主程序代码的某些部分时,才会出现这种缓慢的行为,所以这一定是与此相关的问题。虽然有很多行,但我会继续研究。
无论如何,感谢您的建议,它们对于确定问题很有用。
EDIT 3:
使用 QueryPerformanceCounter 进行测量:
Visual Studio 内部测得的 CPU 周期 (~50k) 是外部测得的 CPU 周期 (~110k) 的一半(顺便问一下,这些是 QueryPerformanceCounter() 返回的实际 CPU 周期吗?)。
将其除以频率显示与 std::chrono 相似的结果。
EDIT 2:
我按照建议检查了进程资源管理器,VS 内和 VS 外加载的 DLL 是相同的。
EDIT 1: 按照要求,我尝试了这个:
auto beginTime = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 1000; ++i)
{
DllFunction();
}
auto endTime = std::chrono::high_resolution_clock::now();
long long totalTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
结果:
运行它release在 Visual Studio 中附带调试器--->~19 seconds
运行它outsideVisual Studio 的 (release构建)--->~40 seconds