我正在开发一款需要调用一系列优化求解器的软件。每个求解器都是一段自动生成的 C 代码,包含数千行代码。我使用了 200 个这样的求解器,仅在要解决的优化问题的大小上有所不同。
总而言之,这些自动生成的求解器产生大约 180MB 的 C 代码,我extern "C"{ /*200 solvers' headers*/ }
在 Visual Studio 2008 中使用语法将其编译为 C++。编译所有这些非常慢(使用“最大速度 /O2”优化标志,大约需要 8 小时)。出于这个原因,我认为将求解器编译成单个 DLL 是一个好主意,然后我可以从一个单独的软件中调用它(这将有一个合理的编译时间,并允许我抽象出所有这些 extern “ C”的东西来自更高级别的代码)。编译后的 DLL 大约为 37MB。
问题是当使用 DLL 执行这些求解器之一时,执行需要大约 30 毫秒。如果我只将单个求解器编译成一个 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;
};
};