मैं एक डीएलएल और एक सामान्य समारोह में एक निर्यातित समारोह की गति का परीक्षण कर रहा था। यह कैसे संभव है कि एक डीएलएल में एक निर्यातित कार्य बहुत तेज है?डीएल फ़ंक्शन कॉल एक सामान्य फ़ंक्शन कॉल के बाद तेज़ है?
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;
}
यह मैं इसे कैसे परीक्षण है:
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;
}
मैं केवल फ़ंक्शन कॉल स्पीड का परीक्षण करता हूं, जीई पते को टकराकर स्टार्ट-अप पर किया जा सकता है। तो इसका प्रदर्शन खो गया नहीं है।
यदि आप 'बाहरी' सी ''से छुटकारा पा रहे हैं तो परिणाम क्या है? – stijn
मुझे विश्वास नहीं है क्योंकि * यह * सामान्य कार्य रेखांकित किया जाएगा लेकिन डीएलएल से कार्य को रेखांकित नहीं किया जा सकता है। तो मुझे लगता है कि आपको कुछ गलत तरीके से करना होगा। क्या आप रिलीज बिल्ड का उपयोग कर रहे हैं? – Nawaz
आपने दोनों परियोजनाओं को कैसे संकलित किया? कुछ अनुकूलन विकल्प निर्णय ले सकते हैं कि फ़ंक्शन को बिल्कुल कॉल न करें, जो तेज़ है। –