fwrite() 与 write() 存在磁盘缓存
fwrite() vs write() in presence of disc caching
Idea/Fact#1
我很少阅读 post 关于如何缓冲流的信息,因此 fwrite() 通常是缓冲流。另一方面 write() 不会被缓冲。
Why the fwrite libc function is faster than the syscall write function?
Idea/Fact#2
我还查看了有关磁盘缓存的文章以及 Linux 如何大量使用它来显着提高磁盘性能。
http://www.linuxatemyram.com/play.html
因此,在 Linux 默认执行的磁盘缓冲存在的情况下,fwrite() 和 write() 不应该呈现相同的性能吗? fwrite() 正在做的是 "buffering over already buffered disc"!这不应该给巨大的推动。我在这里错过了什么?
fwrite
缓冲和磁盘缓存在两个截然不同的级别上工作。
fwrite
在程序级别上工作:它缓冲大量小写并将它们集中在一起以进行一个系统调用,而不是为每个小写进行单独的系统调用。这为您节省了从用户模式切换到内核模式并返回的重复开销。
磁盘缓存在内核级别工作,通过汇集磁盘写入,允许它们被延迟。硬盘可能很慢,所以如果您必须等待磁盘驱动程序消耗完所有数据,那么您的程序就会延迟。通过使用通常比驱动器快得多的缓存,您可以更快地完成对程序的写入和return。当程序继续运行时 运行,缓存将慢慢清空到磁盘上,程序无需等待。
Idea/Fact#1 我很少阅读 post 关于如何缓冲流的信息,因此 fwrite() 通常是缓冲流。另一方面 write() 不会被缓冲。 Why the fwrite libc function is faster than the syscall write function?
Idea/Fact#2 我还查看了有关磁盘缓存的文章以及 Linux 如何大量使用它来显着提高磁盘性能。 http://www.linuxatemyram.com/play.html
因此,在 Linux 默认执行的磁盘缓冲存在的情况下,fwrite() 和 write() 不应该呈现相同的性能吗? fwrite() 正在做的是 "buffering over already buffered disc"!这不应该给巨大的推动。我在这里错过了什么?
fwrite
缓冲和磁盘缓存在两个截然不同的级别上工作。
fwrite
在程序级别上工作:它缓冲大量小写并将它们集中在一起以进行一个系统调用,而不是为每个小写进行单独的系统调用。这为您节省了从用户模式切换到内核模式并返回的重复开销。
磁盘缓存在内核级别工作,通过汇集磁盘写入,允许它们被延迟。硬盘可能很慢,所以如果您必须等待磁盘驱动程序消耗完所有数据,那么您的程序就会延迟。通过使用通常比驱动器快得多的缓存,您可以更快地完成对程序的写入和return。当程序继续运行时 运行,缓存将慢慢清空到磁盘上,程序无需等待。