2010-01-07 50 views
0

我通过fwrite将一些二进制数据写入二进制文件,一旦我通过写入,我正在读取相同的数据,通过fread.While这样做,我发现fwrite花费更少的时间来写入整个数据,因为fread需要更多时间来读取所有数据。 所以,我只想知道它是否总是花费比fread更少的时间,或者我的阅读部分有问题。使用二进制文件执行fread/fwrite时的性能

+0

为什么这会得到downvoted?似乎是一个合理的问题。 – 2010-01-07 12:18:54

回答

3

C++语言对这些(或任何其他)函数的比较性能不作任何保证。这完全取决于硬件和操作系统的组合,机器上的负载和月球的相位。

+2

同意。在你和硬件之间有一整套图层,并且经常在内存中缓冲数据,所以不可能概括这个 – zebrabox 2010-01-07 12:11:19

+0

完全正确。但没有提供任何合理的解释(或潜在原因)的原因。如果我们期望别人提高你至少需要提及那些可能会减缓进程速度的部分,那么他们可以做更多的研究(例如其他三个答案中提到的OS IO缓存机制)。 – 2010-01-07 17:43:07

+0

@Martin像往常一样,我们不同意如何回答SO问题。但你以你的方式去做,我会继续做我的。 – 2010-01-07 17:53:26

1

正如其他人所说的那样,您看到缓冲区/缓存系统的某些效果,但是,如果您使用异步API(如您所说的起诉fread/write,请查看aio_read/aio_write),您可以尝试其他一些I/O方法可能更适合你的工作。

一个建议是,如果您读取/更新/写入/读取文件很多,您应该通过ioctl或DeviceIOControl向操作系统请求以提供代码运行的磁盘的几何形状然后确定磁盘细分器的大小,以便您可以确定是否可以在单个磁盘内缓冲读/写操作。这样,驱动器头就不会移动以进行读/写操作,并为您节省大量运行时间。

2

这些函数与操作系统的文件系统缓存进行交互。在很多情况下,它是一个简单的内存到内存的拷贝。如果您重复运行程序,写入的速度确实会稍微快一点。它只需要在缓存中找到一个空洞来转储它的数据。将数据刷新到磁盘发生在您无法看到或测量的时间。

通常需要更多的工作来阅读。至少需要遍历缓存结构以发现磁盘数据是否已被缓存。如果没有,它将不得不阻止磁盘驱动程序请求以从磁盘中检索数据,这需要几毫秒。

分析此行为的标准陷阱是从您的程序的重复运行中进行测量。它们完全不代表你的程序在野外会表现得那么好。磁盘数据已缓存的可能性为非常适合在您的程序的第二次运行中使用。他们在现实生活中非常贫穷,读数可能非常缓慢,尤其是第一个。一个写入存在额外的特殊陷阱,在某些时候(取决于其他程序的行为),缓存将无法缓冲写入请求。随着程序被阻塞,直到有足够的数据刷新到磁盘,写入性能才会崩溃。

长话短说:不要有史以来假定磁盘读/写性能测量代表了您的程序在生产中的表现。也许更重要的是:在代码中解决磁盘I/O性能问题没有任何可以做的。

4

虽然正如其他人所说,没有保证,但您通常会发现单次写入会比单次读取更快。写入操作可能会将数据复制到缓冲区中并立即返回,而读取操作可能会等待数据从存储设备中读取。有时如果缓冲区填满,写入会很慢;有时如果数据已被提取,读取将会很快。有时候,fread/fwrite与存储硬件之间的许多抽象层之一将决定无缘无故地进入自己的小世界。