Dll函数调用比普通函数调用更快

Dll function call is faster then a normal function call?

本文关键字:函数调用 Dll      更新时间:2023-10-16

我正在测试DLL中导出函数和普通函数的速度。怎么可能在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;
}

我是这样测试的:

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

我只测试函数调用速度,获得地址可以在启动时完成。所以性能损失并不重要

对于一个非常小的函数,区别在于函数返回/清除参数的方式。

然而,这应该不会有太大的区别。我认为编译器意识到你的函数不与resultcalculation做任何事情,并优化它。尝试使用两个不同的变量,然后打印它们的值。