Intel Celeron 847 配备 8GB 内存。 (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 次测试,每次的结果都与此非常相似:
最佳答案
让我们简化您的代码并删除计时内容。
while ( i < ITERATIONS )
{
// allocate 1MB
ptr = new char [1048576]; // 1 byte * 1048576 = 1 MB
}
系统正在为您分配 1Mb 并返回给您地址。然后你要求另一个地址,并将新地址存储在你保存前一个地址的同一个变量中。
new
返回一个指针,而指针实际上只是分配的地址。它不是特殊的电子 key ,也不是具有作用域的对象,它只是内存中分配开始位置的数值。
当您不再需要内存时,您有责任告诉分配器。它无法知道您对该地址数据做了什么,无论您是否存储它。
while ( i < ITERATIONS )
{
// allocate 1MB
ptr = new char [1048576]; // 1 byte * 1048576 = 1 MB
delete [] ptr;
}
如果您不这样做,分配的内存将永远不会返回到池中,直到您的应用程序终止。
这意味着您的应用程序的内存占用量正在增长。在普通的 Windows 下,这可能不是问题,但您在 Windows 的嵌入式风格下运行,其中 一个 Mb 的内存已经是一个很大的数量。前 122Mb 可能已预留给您的应用。但是,一旦您分配了您的应用程序开始时使用的所有堆,分配器就必须调整其堆的大小,以便能够为您提供额外的分配,并且由于这是嵌入式 Windows,调整大小是悲观地完成的。
关于c++ - 如何解释内存分配延迟的急剧跳跃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20277197/