在C中提高文件IO的性能

在对它们执行堆操作之后,我需要逐个将大量的整数写入文件。 我试图将排序的文件合并到一个文件中。 截至目前,我正在每次操作后写入文件。 我使用min heap来合并文件。

我的问题是 –

  1. 执行文件写入时,每次写入文件或一次写入多块内存块时是否访问磁盘?

  2. 如果我将在大小为1024的数组中输出堆,或者可能更多,然后立即执行写操作,它会改善性能吗?

先感谢您。

编辑 – 将使用setbuffer()帮助? 我认为它应该在某种程度上有所帮助。

1. When performing file write, is disk accessed every time a file write is made or chunks of memory blocks are written at a time? 

不会。在输出缓冲区已满之前,不会写入输出。 您可以强制使用fflush写入以刷新输出流,从而导致立即写入,但否则,输出将被缓冲。

 other 1. Will it improve performance if I'll take output of heap in an array of say size 1024 or may be more and then perform a write at once? 

如果你没有耗尽堆,那么不,你不会获得显着的性能将存储放在堆栈上等。缓冲总是首选,但如果你将所有数据存储在一个数组然后调用write,你仍然有相同大小的输出缓冲区来处理。

执行文件写入时,每次写入文件或一次写入多块内存块时是否访问磁盘?

这取决于内核。 在文件描述符上调用fsync()时刷新缓冲区。 fflush()只刷新FILE结构中缓冲的数据,它不会刷新内核缓冲区。

如果我将在大小为1024的数组中输出堆,或者可能更多,然后立即执行写操作,它会改善性能吗?

我前段时间做过测试,将write()fwrite()与自定义实现进行比较,事实certificate,通过直接用大块调用write()可以获得公平的加速。 这实际上是fwrite()作用,但由于它必须维护的基础结构,它比自定义实现慢。 至于缓冲区大小,1024肯定是太小了。 8K或其他东西会表现更好。

它是特定于操作系统和实现的。

在大多数Linux系统上 – 如Ext4这样的良好文件系统 – 内核将通过缓存大量文件系统数据来尽量避免磁盘访问。 请参阅linuxatemyram

但我仍然建议避免过多的IO操作,并进行一些缓冲(如果使用stdio(3)例程,将几十千字节的缓冲区传递给fwrite(3)并使用setvbuf(3)和fflush(3)小心;或者使用直接系统调用,如write(2)或mmap(2) ,缓冲区为例如64K字节…)

顺便说一句,使用posix_fadvise(2)系统调用可能会略微帮助提高性能(如果明智地使用)。

实际上,瓶颈通常是硬件。 如果可以,请使用RAM文件系统( tmpfs )或快速SSD磁盘。

在Windows系统(我从未使用过)上,我不知道,但一般的直觉是一些缓冲应该有所帮助。