我对内存映射的I / O经验不足,但是第一次使用它们后,我惊讶于它们的速度。在性能测试中,我发现从内存映射文件读取比通过常规c ++ stdio读取快30倍。
我的测试数据是一个3GB的二进制文件,它包含20个大型双精度浮点数组。测试程序的结构方式称为外部模块的读取方法,该方法使用在后台进行I / O映射的内存。每当我调用read方法时,此外部模块都会返回一个指针和该指针指向的数据大小。从此方法返回后,我调用memcpy将返回的缓冲区的内容复制到另一个数组中。由于我正在执行memcpy来从内存映射文件中复制数据,因此我期望内存映射读取的速度不会比普通stdio快得多,但我感到惊讶的是它快了30倍。
为什么从内存映射文件读取如此之快?
PS:我使用Windows机器。我以I / O速度为基准,计算机的最大磁盘传输速率约为90 MiB / s
IO的OS内核例程(例如读或写调用)仍然只是函数。编写这些功能是为了将数据复制到用户空间缓冲区,或从用户空间缓冲区复制到内核空间结构,然后复制到设备。当您认为有一个用户缓冲区,一个IO库缓冲区(例如stdio buf),一个内核缓冲区,然后是一个文件时,数据可能要经过3个副本才能在程序和磁盘之间移动。IO例程也必须健壮,最后,sys调用自身会施加延迟(捕获到内核,上下文切换,再次唤醒进程)。
内存映射文件时,您将跳过其中的大部分,从而消除了缓冲区副本。通过像对待大型虚拟阵列一样有效地处理文件,可以在不经历系统调用开销的情况下启用随机访问,从而降低了每个IO的延迟,并且如果原始代码效率低下(许多小的随机IO调用),那么开销将减少,甚至更彻底地
虚拟内存,多处理OS的抽象是有代价的,仅此而已。
但是,在某些情况下,您可以通过禁用缓冲来改善IO,这些情况在您知道会损害性能的情况下(例如,大量连续写入),但是除此之外,在不完全消除操作系统的情况下,您确实无法提高内存映射IO的性能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句