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)
Has*_*yed 11
你需要在这里考虑很多元素.我怀疑通用垃圾收集器在取消链接时清理内存 - 这将浪费时间.加上垃圾收集往往不是O(N).垃圾收集通常会运行一些例程 - 这里最简单的一个就是压缩,压缩本身是基于已分配内存分配的统计信息.其他阶段将具有类似的复杂性..
- 在下面的评论和问题后编辑 -
您选择的答案并没有让您更接近这种感觉 - 事实上它完全是误导性的 - 因为它不会迭代内存中的数据结构.它只是粗略地擦除内存,这不是垃圾收集器的工作.
更准确的答案
如果您想真正了解垃圾收集器,我建议编写一个.NET或Java应用程序,并在不同大小的对象中初始化gig +内存,然后随机丢弃100-300mb的对象,然后再次随机重新创建它们大小; 这样做几次通过混合.通过禁用收集器,丢弃一个价值的对象然后强制手动收集来遵循这一点; 最后一个手动集合是您想要进行基准测试的 - 您希望这样做100次左右并绘制结果.
20分钟的注释
我敢肯定,如果这是你想要的,有办法让收藏家以实时模式行事.收集器不必进行完全扫描,可以将其编写为原子操作的集合,并且可以在实时超时(即20 ms)上禁用收集阶段.在这种情况下,它将完成一个仍然有用的部分集合.
您必须调整我提到的策略来衡量在20ms内可以完成多少工作.请务必了解收集的数量更多地取决于存在的对象数量而不是它们的大小.因此,如果您决定正式测试GC,我建议捕获这两个值.