2013-01-11 23 views
5

मैं एक डीएलएल और एक सामान्य समारोह में एक निर्यातित समारोह की गति का परीक्षण कर रहा था। यह कैसे संभव है कि एक डीएलएल में एक निर्यातित कार्य बहुत तेज है?डीएल फ़ंक्शन कॉल एक सामान्य फ़ंक्शन कॉल के बाद तेज़ है?

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; 
} 

मैं केवल फ़ंक्शन कॉल स्पीड का परीक्षण करता हूं, जीई पते को टकराकर स्टार्ट-अप पर किया जा सकता है। तो इसका प्रदर्शन खो गया नहीं है।

+0

यदि आप 'बाहरी' सी ''से छुटकारा पा रहे हैं तो परिणाम क्या है? – stijn

+1

मुझे विश्वास नहीं है क्योंकि * यह * सामान्य कार्य रेखांकित किया जाएगा लेकिन डीएलएल से कार्य को रेखांकित नहीं किया जा सकता है। तो मुझे लगता है कि आपको कुछ गलत तरीके से करना होगा। क्या आप रिलीज बिल्ड का उपयोग कर रहे हैं? – Nawaz

+1

आपने दोनों परियोजनाओं को कैसे संकलित किया? कुछ अनुकूलन विकल्प निर्णय ले सकते हैं कि फ़ंक्शन को बिल्कुल कॉल न करें, जो तेज़ है। –

उत्तर

8

एक बहुत छोटे से समारोह के लिए, अंतर तरीका है कि एक समारोह रिटर्न/तर्कों को साफ कर रही है।

हालांकि, कि है कि बहुत अधिक अंतर नहीं होना चाहिए। मुझे लगता है कि संकलक को पता चलता है कि आपका फ़ंक्शन परिणाम के साथ कुछ भी नहीं करता है और इसे अनुकूलित करता है। दो अलग-अलग चर का उपयोग करने का प्रयास करें और बाद में अपना मूल्य प्रिंट करें।

+0

अनुकूलन वास्तव में समस्या थी। जब मैं int परिणाम गणना को स्वैप करता हूं; अस्थिर int परिणाम गणना करने के लिए; तो सामान्य कॉल तेज है। (इसके लिए @WhozCraig धन्यवाद।) – Laurence