【发布时间】:2014-02-26 06:47:32
【问题描述】:
今天我移植了我的旧内存基准
从 Borland C++ builder 5.0 到 BDS2006 Turbo C++ 发现了奇怪的事情。
- BCB5 的 exe 运行正常且稳定
-
BDS2006 中的 exe 仅在主窗体启动之前(在其构造函数中)测量 OK,并且如果在主窗体为
Activated或什至在任何 VCL 之后再次启动基准测试时strong> 组件更改(例如主窗体的Caption),那么基准线程的速度会受到很大影响。
经过一番研究,我发现:
- 不管测试是否在线程内。
- 进程/线程优先级,亲缘关系也不影响这一点。
- 隐藏任何窗口 (
Visibility,Enabled) 不会影响这一点。 - 调用测试表单
OnIdleEvent不影响这个 - 如果时间由
RDTSC或PerformanceCounter测量,则无关紧要
我的结论是 VCL 库在后台运行一些代码/线程,所以我的问题是:
-
有没有办法暂时暂停 VCL 代码/东西?
理想的是
Application->Pause();和Application->Resume();或只是Forms。 -
还有什么可能导致这种行为以及如何避免它?
附言。
测试应用程序除了主窗体外没有 VCL 组件。基准测试只是rep stosd 的一些内存传输,具有不同的块大小(没什么好笑的)。来源在this related Q/A。我知道 BDS2006 已经过时了,但我现在不寻求升级,所以请跳过任何关于它们根本没有帮助的 cmets。
在 Windows7 pro x64、32bit 应用程序上测试
【问题讨论】:
-
您需要进行一些调试。我建议你在问之前把事情缩小一点。不,VCL 不只是为了踢球而运行额外的线程。如果您想查看正在运行的线程,请使用提供该信息的众多调试器之一。底线是您需要收集更多信息并缩小范围。
-
@David Heffernan 在发布这个问题之前我花了好几个小时并消除了几乎所有的东西(只剩下 WNDPROC),这可能会导致只有一个 memtest 功能的空应用程序中出现这种情况。又过了几个小时,我发现 BDS2006::VCL 中的 wndproc 可能使 CPU 的指令缓存无效/填充。
-
问题是,所有这些都是您的应用程序的细节,我们无法真正看到或理解。
-
是的,我知道,但是在 PS 问题中说这是一个干净的应用程序(除了表单之外没有其他 VCL 组件),也是我之前消除的......但是是的,我可以写得更好,谢谢反正里面
标签: c++ c++builder benchmarking vcl cpu-cache