今天我移植了我的旧内存基准
从 Borland C ++ builder 5.0 到 BDS2006 Turbo C ++ ,发现奇怪的事情。
Activated
之后或甚至在任何 VCL之后再次启动基准测试时确定组件更改(例如主窗体的Caption
)然后基准线程的速度受到很大影响。
经过一番研究后我发现:
Visibility,Enabled
)不会影响此。OnIdleEvent
不会影响此RDTSC
或PerformanceCounter
衡量,则我的结论是 VCL 库在后台运行一些代码/线程,所以我的问题是:
有没有办法暂时暂停VCL代码/内容?
理想的内容包括Application->Pause();
和Application->Resume();
或Forms
。
还有什么可能导致此行为以及如何避免此行为?
PS。
测试应用程序没有主表单以外的 VCL 组件。基准测试只是rep stosd
的一些内存传输,具有不同的块大小(没有有趣的东西)。来源位于this related Q/A。我知道 BDS2006 已过时,但我现在不打算升级,所以请跳过任何关于他们根本没有帮助的评论。
在 Windows7专业版x64 ,32bit
应用
答案 0 :(得分:1)
我在 BDS2006 :: VCL wndproc
CACHE 中发现了invalidates
。
我尝试按wndproc
覆盖winapi
Application->Handle
的很容易,但它不会停止处理Form
的消息。当我尝试Form1->Handle
作为窗口时,error 1400
出现(无效的窗口句柄)
我试图通过VCL覆盖wndproc
代表TApplication events
申请,Form
覆盖虚拟wndproc
会员。消息处理停止但其调用序列仍然存在,问题也未解决。
因此,在消除了我能想到的所有可能性后,我的结论是,在设置进程/线程进行基准测试后,我需要以某种方式更强烈地刷新 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 调用之前完成基准测试。