Stavo testando la velocità di una funzione esportata in una DLL e una funzione normale. Com'è possibile che una funzione esportata in una DLL sia molto più veloce?La chiamata della funzione Dll è più veloce di una normale chiamata di funzione?
100000000 function calls in a DLL cost: 0.572682 seconds
100000000 normal function class cost: 2.75258 seconds
Questa è la funzione nella DLL:
extern "C" __declspec (dllexport) int example()
{
return 1;
}
Questa è la normale chiamata di funzione:
int example()
{
return 1;
}
Ecco come ho provarlo:
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;
}
Ho solo provato la funzione chiamata velocità, ge l'indirizzo può essere fatto all'avvio. Quindi la performance persa di quello non mater.
qual è il risultato se ti sbarazzi di "extern" C "'? – stijn
Non ci credo perché * questa * funzione normale sarà inline ma la funzione dalla DLL non può essere inline. Quindi penso che tu stia facendo qualcosa in modo inappropriato. Stai usando la versione di rilascio? – Nawaz
Come hai compilato entrambi i progetti? Alcune opzioni di ottimizzazione potrebbero decidere di non chiamare affatto la funzione, che è più veloce. –