受VCL影响的基准测试

时间:2014-02-02 21:06:35

标签: c++ c++builder benchmarking vcl cpu-cache

今天我移植了我的旧内存基准

Borland C ++ builder 5.0 BDS2006 Turbo C ++ ,发现奇怪的事情。

    来自 BCB5
  • exe运行正常且稳定
  • 来自 BDS2006
  • exe仅在主窗体启动之前(在其构造函数内)并且如果在主窗体Activated之后或甚至在任何 VCL之后再次启动基准测试时确定组件更改(例如主窗体的Caption)然后基准线程的速度受到很大影响。

VCL memory benchmark

经过一番研究后我发现:

  • 如果测试是在线程内部,则不匹配。
  • 进程/线程优先级,亲和性也不会影响它。
  • 隐藏任何窗口(Visibility,Enabled)不会影响此。
  • 调用测试表单OnIdleEvent不会影响此
  • 如果时间由RDTSCPerformanceCounter 衡量,则
  • 不会生效

我的结论是 VCL 库在后台运行一些代码/线程,所以我的问题是:

  1. 有没有办法暂时暂停VCL代码/内容?

    理想的内容包括Application->Pause();Application->Resume();Forms

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

  3. PS。

    测试应用程序没有主表单以外的 VCL 组件。基准测试只是rep stosd的一些内存传输,具有不同的块大小(没有有趣的东西)。来源位于this related Q/A。我知道 BDS2006 已过时,但我现在不打算升级,所以请跳过任何关于他们根本没有帮助的评论。

    Windows7专业版x64 32bit应用

    上进行测试

1 个答案:

答案 0 :(得分:1)

我在 BDS2006 :: VCL wndproc CACHE 中发现了invalidates

  1. 我尝试按wndproc覆盖winapi

    Application->Handle

    很容易,但它不会停止处理Form的消息。当我尝试Form1->Handle作为窗口时,error 1400出现(无效的窗口句柄)

  2. 我试图通过VCL覆盖wndproc

    代表TApplication events申请,Form覆盖虚拟wndproc会员。消息处理停止但其调用序列仍然存在,问题也未解决。

  3. 因此,在消除了我能想到的所有可能性后,我的结论是,在设置进程/线程进行基准测试后,我需要以某种方式更强烈地刷新 CACHE

    DOS 中,我会通过单一指令完成它,但在 windows 上它更棘手。那么以前版本的内存基准测试只使用了内存填充,这对于 BDS2006 exe来说显然是不够的。我认为指令 CACHE 涉及到这个问题而不是数据缓存,所以我稍微改了一下它最终解决了问题。

    刷新CPU CACHE:

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

    其中dat为128MB分配内存块(或更大),必须在所有进程/线程优先级和关联性更改或所有 winapi 调用之前完成基准测试。