我正在testingDLL和正常函数中的导出函数的速度。 在DLL中导出的函数怎么可能快得多?
100000000 function calls in a DLL cost: 0.572682 seconds 100000000 normal function class cost: 2.75258 seconds
这是DLL中的函数:
extern "C" __declspec (dllexport) int example() { return 1; }
这是正常的函数调用:
int example() { return 1; }
这是我如何testing它:
int main() { LARGE_INTEGER frequention; LARGE_INTEGER dllCallStart,dllCallStop; LARGE_INTEGER normalStart,normalStop; int resultCalculation; //Initialize the Timer ::QueryPerformanceFrequency(&frequention); double frequency = frequention.QuadPart; double secondsElapsedDll = 0; double secondsElapsedNormal = 0; //Load the Dll HINSTANCE hDll = LoadLibraryA("example.dll"); if(!hDll) { cout << "Dll error!" << endl; return 0; } dllFunction = (testFunction)GetProcAddress(hDll, "example"); if( !dllFunction ) { cout << "Dll function error!" << endl; return 0; } //Dll resultCalculation = 0; ::QueryPerformanceCounter(&dllCallStart); for(int i = 0; i < 100000000; i++) resultCalculation += dllFunction(); ::QueryPerformanceCounter(&dllCallStop); Sleep(100); //Normal resultCalculation = 0; ::QueryPerformanceCounter(&normalStart); for(int i = 0; i < 100000000; i++) resultCalculation += example(); ::QueryPerformanceCounter(&normalStop); //Calculate the result time secondsElapsedDll = ((dllCallStop.QuadPart - dllCallStart.QuadPart) / frequency); secondsElapsedNormal = ((normalStop.QuadPart - normalStart.QuadPart) / frequency); //Output cout << "Dll: " << secondsElapsedDll << endl; //0.572682 cout << "Normal: " << secondsElapsedNormal << endl; //2.75258 return 0; }
我只testing函数调用速度,得到的地址可以在启动时完成。 所以失去的性能并不重要。
对于一个非常小的函数,区别就在于函数返回/清除参数。
但是,这不应该有很大的区别。 我认为编译器意识到你的函数不会对resultCalcuation做任何事情并优化它。 尝试使用两个不同的变量,然后打印它们的值。