调用函数Delphi与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中的参数以作为指针传递,但没有帮助。我想这可能是因为它是按价值传递的,需要复制,但事实并非如此。我认为"内联"指令没有生效。
我相信Delphi应用程序应该可以像C应用程序一样快。
此函数调用不会导致任何性能问题-问题出现在代码的完全不同的部分。
您将Win32GetWallClock()
作为End
传递,将LastCounter
作为Start
传递,因此函数正确地计算
Win32GetWallClock().QuadPart - LastCounter.QuadPart
但是内联版本计算
LastCounter.QuadPart - Win32GetWallClock().QuadPart
其为零或负。
相关文章:
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 查找标准::hash_map与标准::矢量的速度
- 加快在C++中读取/处理日志文件的速度
- 为什么这些算法的运行速度比它们应该的要快?
- 如何提高文件的读取速度?
- 通过libpqxx提高PostgreSQL数据库的更新速度
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 计算车辆之间的距离并设置速度,使距离保持不变,例如 5 米
- 如何加快大字符串的解析速度?
- 如何比较两个函数的速度和性能
- 线程相互减慢速度
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- 使用 Unity 构建加快C++构建速度,并减少标头依赖项
- 从 OpenCV 3 切换到 OpenCV 4 会导致网络摄像头以最大 5 fps 的速度录制,而不是通常的 30 f
- 如何构建模板的显式实例化以提高编译速度?