Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 擦除1 GB内存需要多长时间?_C_Performance_Memory - Fatal编程技术网

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

C 擦除1 GB内存需要多长时间?,c,performance,memory,C,Performance,Memory,今天我们讨论了垃圾收集需要多长时间。我们想知道仅仅擦除1GB内存需要多长时间。需要多少时间?在我的机器上,大约一秒钟: #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:

今天我们讨论了垃圾收集需要多长时间。我们想知道仅仅擦除1GB内存需要多长时间。需要多少时间?

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

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

有人会认为将1G内存返回到空闲池只是一些简单的指针操作。地面军事系统通常不会清除返回的内存


分配一个1 GIG内存的时间取决于O/S中的时间-你必须设置页面表等等..

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

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

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

更准确的答案

如果你想真正了解垃圾收集器,我建议你编写一个.NET或Java应用程序,初始化不同大小的内存,然后随机丢弃100-300mb的对象,然后重新创建随机大小的对象;这样做几次,把事情搞混。随后,禁用收集器,丢弃相当于gig的对象,然后强制手动收集;这最后一个手动集合是您想要基准测试的--您想要这样做100次左右,然后绘制结果

20毫秒的音符

我相信有很多方法可以让收集器以实时模式运行,如果这是您所希望的。收集器不必执行完全扫描,它可以被写入以作为原子操作的集合执行,并且您可以在实时超时(即20毫秒)时禁用收集阶段。在这种情况下,它将执行部分收集,这仍然是有用的


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

不久前,我在几个最新的桌面机型上测量了内存带宽,使用突发传输进行测试,得出了一致的数字:大约每秒5 GB。这与尼科的数字非常吻合,一场演出0.205秒。0.845秒的系统时间在内存可用时消耗。这与硬盘的速度、分页文件的状态以及RAM中加载的其他程序页面数(而不是内存带宽)有很大关系


换句话说,你衡量的任何东西都有可能下降400%或更多。有时更多。

吃比萨饼需要多长时间?这取决于谁在吃它,以及它的大小和种类。同样的问题也适用于你的问题。哦,但是你知道,只是数量级会很有趣。它更像是几天还是几纳秒?只是想了解一下。调用memset并启动探查器需要几秒钟的时间。需要注意的是,垃圾收集并不要求您实际擦除垃圾收集对象占用的内存。使用强大且接近的EMP,大约需要一纳秒。使用经过训练的蚂蚁,几年。加上15秒输入程序来完成+1除非您需要0x00模式的7字节和0x01模式的1字节,否则我强烈建议使用memset()。这个答案既不现实又幼稚。。。这和垃圾收集到底有什么关系?哈桑·赛德是正确的。这个答案与垃圾收集无关,正如其他人所提到的,如果确实需要擦除内存,memset的性能会好得多。14投票结果令人震惊,人们看到一些代码后会过度兴奋:/(+1)好建议:D.@jack在运行任何测试之前禁用hd交换区(windows中的页面文件),并且机器中有足够的ram。
$ gcc -O3 -std=c99 mem.c -o mem
$ time ./mem
Gigabytes: 1

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