【发布时间】:2014-06-12 07:56:55
【问题描述】:
我注意到逐字节读取文件比使用 fread 读取文件需要更多时间。
根据cplusplus:size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
从流中读取count 元素的数组,每个元素的大小为size 字节,并将它们存储在ptr 指定的内存块中。
Q1) 那么,fread 再次以 1 个字节读取文件,那么它与以 1 个字节的方法读取不一样吗?
Q2 ) 结果证明fread 仍然需要更少的时间。
来自here:
我用一个大约 44 兆字节的文件作为输入来运行它。用VC++2012编译时,得到如下结果:
使用 getc 计数:400000 时间:2.034
使用 fread 计数:400000 时间:0.257
也很少有关于 SO 的帖子谈到它取决于操作系统。
Q3) 操作系统的作用是什么?
为什么会这样?幕后究竟发生了什么?
【问题讨论】:
-
投反对票的人请发表评论并告诉我原因,如果有任何重复请注明。
-
这是一个标准的基准测试错误。对于标准驱动器,从磁盘读取数据的速度在 10 到 60 兆字节/秒之间。您无法在 0.257 秒内读取 44 MB 的文件。因此,您实际上并没有在第二次测试中读取驱动器,而是从文件系统缓存中读取。您可以使用 SysInternals 的 RamMap 实用程序让您的机器进入一个可以比较苹果并避开橘子的状态。
-
@Hans:现代磁盘的顺序读取速度从大约 90MB/s 的中档旋转磁盘到超过 500MB/s 的 PCI 连接 SSD。在 1/4 秒内读取 44MB 是完全可能的。
-
考虑到 Jerry Coffin 是这些数字的来源,我真的怀疑他未能加热缓存。