我正在研究需要調用一組優化求解器的軟件。每個求解器都是一段自動生成的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