调用函数Delphi与C++的速度

Speed of calling a function Delphi vs C++

本文关键字:速度 C++ 函数 Delphi 调用      更新时间:2023-10-16

我正在将handmadehero.org项目中的C代码转换为Delphi代码。我在一件特定的作品上遇到了性能问题:

原件:

inline real32
Win32GetSecondsElapsed(LARGE_INTEGER Start, LARGE_INTEGER End)
{
    real32 Result = ((real32)(End.QuadPart - Start.QuadPart) /
                     (real32)GlobalPerfCountFrequency);
    return(Result);
}

我的版本:

function Win32GetSecondsElapsed(Start, &End : LARGE_INTEGER): real32; inline;
begin
 Result := (&End.QuadPart - Start.QuadPart) / GlobalPerfCountFrequency;
end;

在调用睡眠函数后,有这样的代码来确保我们达到目标帧速率:

SleepMilliSeconds = <some code that calcs how long to wait to hit target frame rate>
Sleep(SleepMilliSeconds);
real32 TestSecondsElapsedForFrame = Win32GetSecondsElapsed(LastCounter, Win32GetWallClock());
Assert(TestSecondsElapsedForFrame < TargetSecondsPerFrame);

如果我使用相同的代码(只是它是Delphi版本),我会得到一个断言错误。

如果我将代码更改为:

TestSecondsElapsedForFrame := ((LastCounter.QuadPart - Win32GetWallClock().QuadPart) / GlobalPerfCountFrequency);
Assert(TestSecondsElapsedForFrame < TargetSecondsPerFrame);

错误消失了,所以对Delphi中函数的调用需要足够长的时间来推动我完成睡眠。有人知道我该怎么解决吗?我曾尝试更改Win32GetSecondsElapsed中的参数以作为指针传递,但没有帮助。我想这可能是因为它是按价值传递的,需要复制,但事实并非如此。我认为"内联"指令没有生效。

我相信Delphi应用程序应该可以像C应用程序一样快。

此函数调用不会导致任何性能问题-问题出现在代码的完全不同的部分。

您将Win32GetWallClock()作为End传递,将LastCounter作为Start传递,因此函数正确地计算

Win32GetWallClock().QuadPart - LastCounter.QuadPart

但是内联版本计算

LastCounter.QuadPart - Win32GetWallClock().QuadPart

其为零或负。