【问题标题】:How long does it take to wipe 1 GB of memory?擦除 1 GB 内存需要多长时间?
【发布时间】:2009-12-15 23:55:53
【问题描述】:

今天我们讨论了垃圾回收中断需要多长时间。并且想知道简单地擦除 1 GB 的内存需要多长时间。需要什么?

【问题讨论】:

  • 吃一个披萨需要多长时间?这取决于谁在吃它,以及它的大小和种类。同样的问题也适用于您的问题。
  • 哦,但你知道,只是数量级会很有趣。它更像是几天还是纳秒?只是为了感受一下。
  • 调用 memset 并启动分析器需要花费几秒钟的时间。
  • 需要注意的是,垃圾回收并不要求你真正擦除垃圾回收对象占用的内存。
  • 拥有强大而接近的 EMP,一纳秒左右。使用训练有素的蚂蚁,数年。

标签: c performance memory


【解决方案1】:

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

#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;
    }
}

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

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

real    0m1.056s
user    0m0.205s
sys  0m0.845s

【讨论】:

  • 显然需要 15 秒来键入程序来执行此操作。 +1
  • 除非有特殊原因需要 7 个字节的 0x00 和 1 个字节的 0x01 模式,否则我强烈推荐使用 memset()。
  • 这个答案是不切实际和幼稚的......它与垃圾收集到底有什么关系?
  • 哈山赛义德是正确的。这个答案与垃圾收集无关,正如其他人所提到的,如果确实需要擦除内存,那么 memset 的性能会好得多。
  • 14 票赞成令人震惊,人们看到一点代码就会过度兴奋:/
【解决方案2】:

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

-- 在 cmets 下面和问题中编辑--

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

更准确的答案

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

20 毫秒的注释

如果您希望这样做,我确信有办法让收集器以实时模式运行。收集器不必进行全面扫描,它可以编写为作为原子操作的集合执行,并且您可以在实时超时(即 20 毫秒)上禁用收集阶段。在这种情况下,它会完成一个仍然有用的部分收集。

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

【讨论】:

    【解决方案3】:

    人们会期望将 1 GIG 内存返回到空闲池只是一些简单的指针操作。 GC 通常不会清除返回的内存。

    分配 1 GIG 内存的时间取决于当时 O/S 中的情况 - 您必须设置页表等...

    【讨论】:

      【解决方案4】:

      前段时间,我在几款最近的台式机型号上测量了内存带宽,测试了突发传输,并得出了一个一致的数字:大约 5 GB/秒。这与 Niko 的数字非常吻合,演出时间为 0.205 秒。 0.845 秒的系统时间在使内存可用时被烧毁。这与您的硬盘速度、页面文件的状态以及在 RAM 中加载了多少其他程序的页面有关,而不是与内存带宽有关。

      换句话说,您测量的任何东西都可能偏离 400% 或更多。有时更多。

      【讨论】:

      • (+1) 好建议:D。 @jack 在运行任何测试之前禁用高清交换区域(Windows 中的页面文件),并在机器中有足够的内存。
      猜你喜欢
      • 2020-02-28
      • 2012-09-06
      • 2018-12-07
      • 2012-11-30
      • 2011-10-26
      • 2013-06-04
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多