我想知道逐块写入文件的好处是什么.我认为这会减少io操作.但是在linux之类的环境中,数据无论如何都会进入页面缓存和后台守护程序进行物理磁盘写入(如果我错了,请纠正我).在这种环境中,块写入有什么优势?
解决方法:
如果我正确地理解了您的问题,那么您是在问使用更大的块而不是逐个字符地编写代码的好处.
您必须考虑到,每次使用系统调用(例如write()
)本身都具有最低成本,而无论执行什么操作.另外,这可能导致调用进程要承受context switch的费用,这本身是有代价的,并且还允许其他进程使用CPU,从而导致更大的延迟.
因此,即使我们忘记了直接和同步I / O模式,每个操作都可能立即将其移到磁盘上,但从性能的角度来看,通过在较大的数据块之间移动来减少这些不变成本的影响是有意义的.
使用dd传输1,000,000字节的简单演示:
$dd if=/dev/zero of=test.txt count=1000000 bs=1 # 1,000,000 blocks of 1 byte
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB) copied, 1.55779 s, 642 kB/s
$dd if=/dev/zero of=test.txt count=100000 bs=10 # 100,000 blocks of 10 bytes
100000+0 records in
100000+0 records out
1000000 bytes (1.0 MB) copied, 0.172038 s, 5.8 MB/s
$dd if=/dev/zero of=test.txt count=10000 bs=100 # 10,000 blocks of 100 bytes
10000+0 records in
10000+0 records out
1000000 bytes (1.0 MB) copied, 0.0262843 s, 38.0 MB/s
$dd if=/dev/zero of=test.txt count=1000 bs=1000 # 1,000 blocks of 1,000 bytes
1000+0 records in
1000+0 records out
1000000 bytes (1.0 MB) copied, 0.0253754 s, 39.4 MB/s
$dd if=/dev/zero of=test.txt count=100 bs=10000 # 100 blocks of 10,000 bytes
100+0 records in
100+0 records out
1000000 bytes (1.0 MB) copied, 0.00919108 s, 109 MB/s
另外一个好处是,使用更大的数据块可以使I / O调度程序和文件系统的分配器对您的实际工作量进行更准确的估计.