我正在阅读维基百科的文章 "阻止(数据存储)" https://en.wikipedia.org/wiki/Block_(data_storage)
文章说
"阻止可以减少开销并加快数据流的处理速度。"
阻止如何减少开销?
假设我有一个字符数组
long block_size = ...;
char *buf = ...;
FILE *fp = fopen(filename, "myfile");
并循环此函数
While(everything in buf not written)
fwrite(buf, 1, block_size, fp);
fflush(fp);
这样的事情如何减少开销?看起来这甚至会增加开销? 我举例说明了使用阻止的正确方法吗?
答案 0 :(得分:1)
让我们说你想写数据。你要写的字节数是N*block_size+C
,其中N和C只是非负常数。
如果您将代码修改为
While(everything in buf not written)
fwrite(buf, 1, not_a_multiple_of_the_block_size, fp);
fflush(fp);
您强制执行其他IO操作。比方说吧
not_a_multiple_of_the_block_size = 1.5 * block_size
循环的第一次迭代将写入整个块以及半个数据块。在物理上,IO子系统必须检索两个块,用数据完全填充一个块。
下一次迭代将需要写入第一个半块的块从存储中检索,更新并写回存储加一个新块。
对于循环的前两次迭代,您有一个额外的获取操作,将第二个块的内容带入内存 1 ,相比之下,如果您使用了块大小的写入(或者块大小的整数倍)。如果您使用的是旋转硬盘(或磁带机),则必须等到该块物理位于读头下方。
现代硬件倾向于通过缓存最小化额外开销(注意维基百科文章通过名称提到磁带驱动器......)但是当不使用块大小的整数倍时,通常仍然会有一些额外的开销。 / p>
1 数据可能会被带入IO子系统控制器的内存中,而不一定会进入系统RAM。