【发布时间】:2013-12-15 03:28:33
【问题描述】:
配备 8GB RAM 的英特尔赛扬 847。 (C/C++ 不是 .NET)
这是在 Windows EC7 上运行的唯一线程/函数。
它只是循环分配 1MB 的内存,1000 次。
但是,在循环的第 122 次迭代之后,分配所需的时间从大约 47 微秒增加到 327 微秒。
有哪些可能的原因可以向我的老板解释这一点?
while ( i < ITERATIONS )
{
QueryPerformanceCounter(&li);
start = double(li.QuadPart) / PCFreq;
// allocate 1MB
ptr = new char [1048576]; // 1 byte * 1048576 = 1 MB
QueryPerformanceCounter(&li);
stop = double(li.QuadPart) / PCFreq;
delayAlloc[i] = stop - start;
}
编辑
为了确定,我又执行了 3 次测试,每次的结果都与此非常相似:
【问题讨论】:
-
问:这是一个物理设备(而不是模拟器),对吗?问:您的设备上有多少物理 RAM?问:您是在 .Net 还是 C/C++ 中编码?问:您能否运行 WinCE 等效的 TaskMgr 或性能监视器? DevHealth 呢?您需要获得更多信息才能希望回答这个问题...
-
对你老板的一个解释是,即使在这么简单的一段代码中,你也设法造成了内存泄漏?
-
您可以尝试使用调试器在第 1 次和第 123 次迭代中单步执行新代码,以查看它采用的代码路径。您使用的是哪个编译器?这将告诉我们它是哪个内存分配器。
-
您没有触及分配的内存:首先要找出的是:来自
new的内存是否正在提交(分配的物理内存帧?)或者它只是未填充的虚拟内存内存? -
@P.S. :根据分配器和 Windows 本身管理内存块(页面)的方式,如果已经分配了相当大的块(如 @Hari Mahadevan 解释的),则可能会间接获取新块。将其视为容器结构,分配条目越多,必须完成的工作就越多才能找到内存中的空闲间隙。还有硬件限制,阅读有关 CPU 的 MMU&TLB 的信息,它们具有有限数量的(缓存)条目,并且在通过缓存拉内存页(+条目)时具有一定的开销。要获得有意义的结果,请
memset()块,以“弄脏”页面。
标签: c++ c windows memory windows-ce