我正在开发一款需要调用优化器的软件。每个优化器都是自动生成的C代码,有数千行代码。我使用了200个这样的优化器,只是解决问题的优化大小不同。
总的来说,这些自动生成的优化器约为180MB的C代码,我使用Visual Studio 2008将其编译成C++,采用
问题在于,使用该DLL执行其中一个优化器需要约30ms的时间。如果我仅将一个单独的优化器编译为DLL并从同一程序中调用它,则执行速度快了100倍(<1ms)。这是为什么?我能解决这个问题吗?
下面是DLL的代码。每个优化器使用相同的结构(即它们具有相同的成员变量),但它们具有不同的名称,因此需要进行类型转换。
总的来说,这些自动生成的优化器约为180MB的C代码,我使用Visual Studio 2008将其编译成C++,采用
extern "C"{ /*200 solvers' headers*/ }
语法。编译这些代码非常慢(使用“最大速度/O2”优化标志需要约8小时)。因此,我认为将这些优化器编译成单个DLL是一个好主意,然后我可以从另一个软件中调用它(这个软件具有合理的编译时间,并允许我从更高级别的代码中抽象出所有这些extern "C"的内容)。编译后的DLL大小约为37MB。问题在于,使用该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;
};
};