我正在研究需要调用一组优化求解器的软件。每个求解器都是一段自动生成的C代码,包含数千行代码。我使用了200个这样的解算器,仅在要解决的优化问题的大小上有所不同。总而言之,这些自动生成的求解器大约有180MB的C代码,我在Visual Studio 2008中使用extern "C"{ /*200 solvers' headers*/ }
语法编译为C++。编译所有这些都非常慢(“最大值速度/ O2“优化标志,大约需要8小时)。出于这个原因,我认为将解算器编译成单个DLL是个好主意,然后我可以从一个单独的软件中调用它(这将具有合理的编译时间,并且允许我抽象出所有这个extern“ C“来自更高级代码的东西)。编译后的DLL大约为37MB。大C++ dll的自动生成C代码的性能损失
问题是,当使用DLL执行其中一个解算器时,执行需要大约30ms。如果我只编译一个解析器到一个DLL中,并从同一个程序中调用它,执行速度大约快100倍(< 1ms)。为什么是这样?我可以绕过吗?
该DLL看起来如下。每个求解器使用相同的结构(即它们具有相同的成员变量),但它们具有不同的名称,因此所有类型的转换。
extern "C"{
#include "../Generated/include/optim_001.h"
#include "../Generated/include/optim_002.h"
/*etc.*/
#include "../Generated/include/optim_200.h"
}
namespace InterceptionTrajectorySolver
{
__declspec(dllexport) InterceptionTrajectoryExitFlag SolveIntercept(unsigned numSteps, InputParams params, double* optimSoln, OutputInfo* infoOut)
{
int exitFlag;
switch(numSteps)
{
case 1:
exitFlag = optim_001_solve((optim_001_params*) ¶ms, (optim_001_output*) optimSoln, (optim_001_info*) &infoOut);
break;
case 2:
exitFlag = optim_002_solve((optim_002_params*) ¶ms, (optim_002_output*) optimSoln, (optim_002_info*) &infoOut);
break;
/*
...
etc.
...
*/
case 200:
exitFlag = optim_200_solve((optim_200_params*) ¶ms, (optim_200_output*) optimSoln, (optim_200_info*) &infoOut);
break;
}
return exitFlag;
};
};
你在哪个平台上观察过?在32位体系结构的Linux上,'.so'文件需要'-fPIC'来占用一个寄存器,因此代码运行速度可能会慢5%(因为编译器溢出了更多)。 –
提到Visual Studio和DLL,它说Windows。 – themel
@Basile,themel:是的,它全部在Windows上,使用VS2008编译。 – mwmwm