我正在通过fwrite将一些二进制数据写入二进制文件,一旦我完成写作,我正在读回相同的数据。虽然这样做,我发现fwrite花费的时间较少来写整个数据作为fread花了更多的时间来阅读所有数据。 所以,我只想知道它是fwrite总是比fread花费更少的时间或者我的阅读部分存在一些问题。
答案 0 :(得分:4)
虽然正如其他人所说,没有任何保证,但您通常会发现单次写入比单次读取更快。写入可能会将数据复制到缓冲区并立即返回,而读取可能会等待从存储设备获取数据。如果缓冲区填满,有时写入会很慢;如果已经提取数据,有时读取速度会很快。有时,fread
/ fwrite
与存储硬件之间的众多抽象层中的一个将决定无缘无故地进入自己的小世界。
答案 1 :(得分:3)
C ++语言不保证这些(或任何其他)函数的比较性能。这完全取决于硬件和操作系统的组合,机器上的负载和月亮的相位。
答案 2 :(得分:2)
这些功能与操作系统的文件系统缓存交互。在许多情况下,它是一个简单的内存到内存副本。如果重复运行程序,写入的确可能稍微快一点。它只需要在缓存中找到一个漏洞来转储其数据。将数据刷新到磁盘是在您无法查看或测量的时间。
通常需要做更多的工作才能阅读。它至少需要遍历缓存结构以发现磁盘数据是否已经缓存。如果没有,它将不得不阻止磁盘驱动器请求从磁盘检索数据,这需要几毫秒。
分析此行为的标准陷阱是从程序的重复运行中进行测量。它们完全没有代表你的程序在野外表现的方式。磁盘数据已缓存的几率在程序的第二次运行时非常良好。它们在现实生活中非常贫穷,读取可能非常慢,尤其是第一个。对于写入存在额外的特殊陷阱,在某些时候(取决于其他程序的行为),缓存不能缓冲写入请求。随着程序被阻塞直到有足够的数据刷新到磁盘,写入性能将会下降。
长话短说:不要永远假设磁盘读/写性能测量代表了程序在生产中的表现。或许更重要的是:您无法解决代码中的磁盘I / O性能问题。
答案 3 :(得分:1)
您正在看到缓冲区/缓存系统的一些效果,但是,如果您使用异步API(正如您所说的那样,您应该查看aio_read / aio_write),您可以尝试其他一些方法对于I / O而言,它可能更适合您的工作。
一个建议是,如果您经常阅读/更新/写入/读取文件,您应该通过ioctl或DeviceIOControl请求操作系统为您提供运行代码的磁盘的几何形状。 ,然后确定磁盘系列的大小,以便您可以确定是否可以在单个磁体内缓冲读取/写入操作。这样,驱动器头将不会移动以进行读/写操作,并为您节省大量的运行时间。