gpt4 book ai didi

c++ - 受 VCL 影响的基准测试

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:23 27 4
gpt4 key购买 nike

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

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

  • BCB5 的 exe 运行正常且稳定
  • 来自 BDS2006 的 exe 仅在主窗体启动之前(在其构造函数内)测量正常,并且如果基准测试在主窗体被激活之后再次启动或者甚至在任何 < strong>VCL 组件更改(例如主窗体的 Caption)然后基准线程的速度受到强烈影响。

VCL memory benchmark

经过一些研究,我发现:

  • 测试是否在线程内无关紧要。
  • 进程/线程的优先级、亲和性也不影响这一点。
  • 隐藏任何窗口(Visibility,Enabled)对此没有影响。
  • 调用测试窗体OnIdleEvent不影响这个
  • 不管时间是由 RDTSC 还是 PerformanceCounter 测量的

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

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

    Application->Pause();Application->Resume(); 或只是 Forms 这样的理想选择。

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

附言。

测试应用程序除了主窗体外没有任何 VCL 组件。基准测试只是通过 rep stosd 以不同的 block 大小进行的一些内存传输(没有什么有趣的东西)。来源在 this related Q/A .我知道 BDS2006 已经过时,但我现在不打算升级,所以请跳过任何关于它们根本没有帮助的评论。

Windows7 pro x6432bit 应用程序上测试

最佳答案

我发现 BDS2006::VCL invalidates CACHE 中的 wndproc

  1. 我尝试用 winapi 覆盖 wndproc

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

  2. 我试图用 VCL 覆盖 wndproc

    应用程序通过TApplication 事件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 调用之后完成。

关于c++ - 受 VCL 影响的基准测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21516244/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com