【问题标题】:Benchmarking affected by VCL受 VCL 影响的基准测试
【发布时间】: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 库在后台运行一些代码/线程,所以我的问题是:

  1. 有没有办法暂时暂停 VCL 代码/东西?

    理想的是Application->Pause(); 和Application->Resume(); 或只是Forms。

  2. 还有什么可能导致这种行为以及如何避免它?

附言。

测试应用程序除了主窗体外没有 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


【解决方案1】:

我在 BDS2006::VCL invalidates CACHEs 中发现了wndproc。

  1. 我试图用winapi覆盖wndproc

    对于Application->Handle 是这么简单,但它不会停止处理Form 的消息。当我尝试将Form1->Handle 作为窗口时,出现error 1400(无效的窗口句柄)

  2. 我已尝试通过 VCL 覆盖 wndproc

    TApplication events 的应用程序和Form 的虚拟wndproc 成员的覆盖。消息处理停止,但它们的调用序列仍然存在,问题也没有解决。

因此,在排除了我能想到的所有可能性之后,我的结论是,在为基准测试设置进程/线程之后,我需要以某种方式更密集地刷新 CACHE。

在 DOS 中,我会通过单条指令来完成,但在 windows 上会比较棘手。那么之前版本的内存基准测试只使用了内存填充,这对于 BDS2006 exe 显然是不够的。我认为指令 CACHE 与此问题有关,而不是数据缓存,因此我对其进行了一些更改,最终解决了问题。

刷新 CPU 缓存:

for (DWORD i=0;i<(128<<20);i+=7)
    {
    dat[i]+=i;
    dat[i]*=i;
    dat[i]&=i;
    }

其中 dat 是 128MB 分配的内存块(或更大),必须在所有进程/线程优先级和亲和性更改或所有 winapi 调用之后执行基准测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多