在Visual Studio外部启动时,程序运行速度较慢

Ban*_*nex 15 c++ dll visual-studio-2013

我注意到我的程序有一些奇怪的行为.我使用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();
Run Code Online (Sandbox Code Playgroud)

我注意到在Visual Studio外部启动它需要更长的时间.例如:

在Visual Studio 中的调试中运行它并附带调试器 - >~50 ms

在Visual Studio 中的发布中运行它并附带调试器 --->~25 ms

在Visual Studio 中的发布中运行它而不附加调试器 --->~20 ms

Visual Studio 外部运行它(发布版本)--->~80 ms

正如您所看到的,在Visual Studio外部的发布中运行它实际上比运行附加调试器的调试版本花费更长的时间!

有问题的DLL由同一个编译器构建在同一个解决方案中,我已经仔细检查过我启动应用程序的目录中的所有DLL都是正确的.

这种行为可能是什么原因?

编辑5:主应用程序生成另一个控制台应用程序并使用命名管道与它通信.原来,没有产生另一个应用程序使得DLL在Visual Studio外快速调用.

但是,在Visual Studio内部和外部都会生成相同的应用程序,所以我不明白为什么它会减慢Visual Studio外部的其他调用.

编辑4:事实证明,只有当我将函数调用放在我的主程序的代码的某些部分时才出现这种缓慢的行为,所以它必须是与此相关的问题.这是很多行,但我会继续研究.

无论如何,感谢您的建议,它们对于识别问题很有用.

编辑3:使用QueryPerfomanceCounter进行测量:

在Visual Studio中测量的CPU周期(~50k)是外部的一半(~110k)(顺便说一下,QueryPerfomanceCounter()实际CPU周期返回的CPU周期是多少?).

将它除以频率显示与std :: chrono相似的结果.

编辑2:我按照建议检查了进程资源管理器,在VS和VS外部加载的DLL是相同的.

编辑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();
Run Code Online (Sandbox Code Playgroud)

结果:在Visual Studio 中发布,并附带调试器 --->~19 seconds

Visual Studio 外部运行它(发布版本)--->~40 seconds

Ale*_*ves 4

在您第一次调用 DLL 之前,该 DLL 不会加载到程序中。如果该函数非常小,则程序可能会花费大部分时间来加载 DLL。
尝试改成这样:

DllFunction();
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();
Run Code Online (Sandbox Code Playgroud)

这样,就不会考虑加载时间。