调用函数的速度 Delphi vs C++
Speed of calling a function Delphi vs C++
我要运行将 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 中的参数以作为指针传递,但没有帮助。
我认为这可能是因为它正在按值传递并且需要制作副本,但事实并非如此。
我认为 'inline' 指令没有生效。
我相信 Delphi 应用程序应该可以和 C 应用程序一样快。
此函数调用不会导致任何性能问题 - 问题出在代码的完全不同的部分。
您将 Win32GetWallClock()
作为 End
传递,将 LastCounter
作为 Start
传递,因此函数正确计算
Win32GetWallClock().QuadPart - LastCounter.QuadPart
但内联版本计算
LastCounter.QuadPart - Win32GetWallClock().QuadPart
为零或负数。
我要运行将 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 中的参数以作为指针传递,但没有帮助。 我认为这可能是因为它正在按值传递并且需要制作副本,但事实并非如此。 我认为 'inline' 指令没有生效。
我相信 Delphi 应用程序应该可以和 C 应用程序一样快。
此函数调用不会导致任何性能问题 - 问题出在代码的完全不同的部分。
您将 Win32GetWallClock()
作为 End
传递,将 LastCounter
作为 Start
传递,因此函数正确计算
Win32GetWallClock().QuadPart - LastCounter.QuadPart
但内联版本计算
LastCounter.QuadPart - Win32GetWallClock().QuadPart
为零或负数。