我正在编写带有一些实时约束的C代码.我测试了用dd写入磁盘的速度:
dd if =/dev/zero of =/dev/sdb bs = 32K count = 32768 oflag = direct
这会将32GB块中的1GB零写入/ dev/sdb
我达到了大约103 MB/s
现在我以编程方式执行类似的操作:
open("/dev/sdb",O_WRONLY|O_CREAT|O_DIRECT|O_TRUNC, 0666);
Run Code Online (Sandbox Code Playgroud)
我得到一个时间戳值从32K缓冲区写入/ dev/sdb 10,000次(在for循环中)得到另一个时间戳值做一些数字运算以获得以MB/s为单位的速率,它大约是49 MB/s
为什么我不能达到与dd相同的速度?一个strace显示了我使用的相同打开命令.
检查系统调用的内容dd,不仅是打开的,还包括后续的reads和writes.使用正确的缓冲区大小可以在这种大型副本中产生显着差异.请注意,/dev/zero如果您的最终目标是磁盘到磁盘副本,则不适合进行基准测试.
如果dd通过匹配系统调用的系统调用来匹配速度......那么,请阅读源代码.