【发布时间】:2012-09-07 07:31:04
【问题描述】:
我正在开发一款需要调用一系列优化求解器的软件。每个求解器都是一段自动生成的 C 代码,包含数千行代码。我使用了 200 个这样的求解器,不同之处仅在于要解决的优化问题的大小。
总而言之,这些自动生成的求解器会产生大约 180MB 的 C 代码,我在 Visual Studio 2008 中使用 extern "C"{ /*200 solvers' headers*/ } 语法将其编译为 C++。编译所有这些非常慢(使用 "最大速度 /O2" 优化标志,大约需要 8 小时)。出于这个原因,我认为将求解器编译成单个 DLL 是一个好主意,然后我可以从一个单独的软件中调用它(这将有一个合理的编译时间,并允许我抽象出所有这些 extern “ C”的东西来自更高级别的代码)。编译后的 DLL 大约为 37MB。
问题是当使用 DLL 执行这些求解器之一时,执行需要大约 30 毫秒。如果我只将单个求解器编译成一个 DLL,并从同一个程序中调用它,则执行速度大约快 100 倍(
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。
-
@Basile, themel:是的,都是在 Windows 上,用 VS2008 编译的。
-
但是对于 32 位的 Windows(可能还为编译 DLL 代码保留一个额外的寄存器)或 64 位的 Windows 可能很重要。 IT 可能与 Windows 系统上的 ABI 约定有关(32 位和 64 位系统不同)。
-
@Basile:都是 32 位的。编辑:抱歉,要明确一点:我正在编译 Win32,但我在 64 位 Windows 7 上运行。
标签: c++ c performance dll