擦除1 GB内存需要多长时间?

Jac*_*ack 0 c memory performance

今天我们讨论了垃圾收集需要多长时间.并且想知道简单地擦掉1千兆字节的内存需要多长时间.需要什么?

nes*_*983 15

在我的机器上,大约一秒钟:

#include <stdlib.h>
#include <stdio.h>


const long long int NUM =  1024*1024*1024/8;

int main(void) {
    long long int* ptr = malloc(NUM  * sizeof ptr);
    printf("Gigabytes: %lld\n",NUM * sizeof ptr / 1024 / 1024 / 1024);
    for(int i=0;i<NUM;i++) {
        ptr[i]=1l;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我运行以下内容(它也不情愿地测量分配时间:

$ gcc -O3 -std=c99 mem.c -o mem
$ time ./mem
Gigabytes: 1

real    0m1.056s
user    0m0.205s
sys  0m0.845s
Run Code Online (Sandbox Code Playgroud)

  • 显然,加上15秒就可以输入程序来完成它.+1 (7认同)
  • 这个答案是不切实际和天真的......它究竟与垃圾收集有什么关系? (2认同)
  • Hashan Syed是对的.这个答案与垃圾收集无关,正如其他人所提到的,如果确实需要擦除内存,memset会更好地执行. (2认同)
  • 14票投票令人震惊,人们看到了一些代码并且过于兴奋:/ (2认同)

Has*_*yed 11

你需要在这里考虑很多元素.我怀疑通用垃圾收集器在取消链接时清理内存 - 这将浪费时间.加上垃圾收集往往不是O(N).垃圾收集通常会运行一些例程 - 这里最简单的一个就是压缩,压缩本身是基于已分配内存分配的统计信息.其他阶段将具有类似的复杂性..

- 在下面的评论和问题后编辑 -

您选择的答案并没有让您更接近这种感觉 - 事实上它完全是误导性的 - 因为它不会迭代内存中的数据结构.它只是粗略地擦除内存,这不是垃圾收集器的工作.

更准确的答案

如果您想真正了解垃圾收集器,我建议编写一个.NET或Java应用程序,并在不同大小的对象中初始化gig +内存,然后随机丢弃100-300mb的对象,然后再次随机重新创建它们大小; 这样做几次通过混合.通过禁用收集器,丢弃一个价值的对象然后强制手动收集来遵循这一点; 最后一个手动集合是您想要进行基准测试的 - 您希望这样做100次左右并绘制结果.

20分钟的注释

我敢肯定,如果这是你想要的,有办法让收藏家以实时模式行事.收集器不必进行完全扫描,可以将其编写为原子操作的集合,并且可以在实时超时(即20 ms)上禁用收集阶段.在这种情况下,它将完成一个仍然有用的部分集合.

您必须调整我提到的策略来衡量在20ms内可以完成多少工作.请务必了解收集的数量更多地取决于存在的对象数量而不是它们的大小.因此,如果您决定正式测试GC,我建议捕获这两个值.