C++ 程序在Visual Studio之外启动时运行较慢

C++ 程序在Visual Studio之外启动时运行较慢,c++,dll,visual-studio-2013,C++,Dll,Visual Studio 2013,我注意到我的节目有一些奇怪的行为。我用VisualStudio专业2013更新1在C++中编写,它包含一个EXE应用程序,它与多个DLL链接,调用那些DLL中定义的函数。p> 在我的主程序(由数千行代码组成)中,我调用了一个DLL函数(我们称之为DLLFunction()),然后计算调用所花费的时间,如下所示: auto beginTime = std::chrono::high_resolution_clock::now(); DllFunction(); auto endTime = s

我注意到我的节目有一些奇怪的行为。我用VisualStudio专业2013更新1在C++中编写,它包含一个EXE应用程序,它与多个DLL链接,调用那些DLL中定义的函数。p> 在我的主程序(由数千行代码组成)中,我调用了一个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中的发行版中运行它,并附加调试程序-->
~19秒


在Visual Studio(releasebuild)外部运行它-->
~40秒

直到您第一次调用它,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();
DllFunction();
auto beginTime=std::chrono::高分辨率时钟::now();
对于(int i=0;i<1000;++i)
{
DllFunction();
}
自动结束时间=标准::时钟::高分辨率时钟::现在();
long long totalTime=std::chrono::duration_cast(endTime-startTime).count();

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

只有在您第一次运行时才会加载有问题的代码,此时它会获取dll并将其加载到内存中。因为您是在VisualStudio中运行的,所以启动调试器后可能会立即加载所有内容,从而消除第一次调用的开销。这样做可以防止代码在绝对确定需要加载的DLL之前需要额外的空间,并且在某些引用从未被调用时可以节省空间和时间


在测试这样的访问时间时,您应该始终将这样的测试放在一个循环中,并多次运行它们,因为这样的条件会严重影响第一次调用,但不会影响后续调用以及系统的其他条件(如另一个进程所需的资源)可能会引起波动,你会想要平稳下来进行一次好的测试。永远不要相信单实例执行的时间。

我也会尝试删除代码优化。可能是某些内联函数行为在VS调试器中提供了更高的性能


尝试优化关闭后,右键单击项目->属性->配置属性->C/C++->优化->优化=禁用。

对单个函数调用计时是测试代码性能的错误方法。您需要多次调用它,以消除可能影响结果的各种因素(线程调度、上下文切换等)的影响。即使在VisualStudio中,计时也不会关闭吗?不管怎样,我试着在循环中调用函数,但Visual Studio内部和外部仍然有很大的区别。@Banex那么区别是什么?它不会以可预测的方式关闭,这是重要的部分。向我们展示您的新代码和计时。@LuchianGrigore在Visual Studio中运行1000次-->~19秒;Visual Studio外部-->~40秒
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();