file - 较大缓冲区的 C write() 吞吐量不一致
问题描述
我写了一个小程序来测量 c write() 调用的系统时间。我一直将缓冲区附加到文件,直到它达到文件大小。但是对于两种不同的缓冲区大小,我得到的数字截然不同。这是一个片段 -
case#1:
char buffer1[] = malloc(4* 1024);
for(int i=0; i< 1048576; i++){
int w = write(outputfile, buffer1, sizeof(buffer1));
}
case#2:
char buffer2[] = malloc(1024* 1024);
for(int i=0; i< 4096; i++){
int w = write(outputfile, buffer2, sizeof(buffer2));
}
您可以看到程序将 1048576x4kB = 4096x1024kB = ~4096 MB 的数据写入文件的两种情况。
在我的机器(8 gig ddr3 ram,核心 i7,240gb ssd)中,case#1 需要 14.96 系统时间才能完成,吞吐量约为 274 MB/s。
而 case#2 需要 0.9 秒的系统时间来完成,给我一个大约 4551 MB/s 的吞吐量。
我对其他一些缓冲区大小进行了一些中间运行,它们也产生了高度变化的数字。
我知道更大的缓冲区大小意味着对 write() 函数的调用次数更少。但是,不是每次调用都应该花费更长的时间,并且最终完成写入文件所需的总时间应该相同,而不管缓冲区大小如何?为什么不同缓冲区大小的吞吐量变化如此之大?
这是程序:https ://drive.google.com/file/d/1Bj_CnO8DqFrOO3WwbsZbzFYjHLijTW7A/view?usp=sharing
解决方案
推荐阅读
- javascript - 动态 jquery 图像库不适用于 ReactJS
- c# - 当我单击 ListBoxItem 时,如何使 StackPanel 滑到一边
- javascript - Mongoose 填充不填充数组
- javascript - HTML5 - html、前缀和元相关
- sql - SQL - 复杂条件
- go - 在 Go 中将 2^8 位表示转换为 BigInteger
- spring - 无法使用 JUnit 测试弹簧注入
- javascript - 条件为真时链式承诺
- php - 如何使 moloquent 的 embedsOne 关系起作用?
- ruby-on-rails - Bootstrap 4 药丸标签不会加载内容——Rails 4