Windows和Mac OS X IO的差异,2015年的性能调整?

这里有经验的Mac / OS X Developer,与libCinder(一个用于graphics的跨平台C ++工具包)一起工作,寻找优化Windows磁盘访问的一些指导。

我正在优化磁盘读取(大,高分辨率)图像序列的过程。 我已经在运行OS X 10.10的Mac上实现了我的优化,几乎使我的磁盘性能翻了一番,以匹配合成磁盘基准(yay)。

在Windows上testing相同的代码导致性能没有提高(boo!)

我想解释我在做什么,为什么,我理解的是什么。

我的代码的当前状态:

我的代码有4个线程:

  • 主线程后退OpenGL和渲染,处理事件等
  • 线程1从磁盘读取,并将我的图像从磁盘表示(tiff头和全部)直接加载到内存中,并转储到cinder缓冲区对象的并发循环缓冲区中。 (监制)。
  • 线程2从我的循环缓冲区中读取缓冲区(消费者)并将它们“解码”为原始的cinder表面对象(未压缩的图像数据),并将它们添加到第二个并行循环缓冲区(Producer)
  • 线程3从我的表面缓冲区中读取并作为纹理提交给辅助GL上下文,并通知main有新的纹理可用。

我从testing性能和热点的方式分离我的线程,表明磁盘访问+文件解码是一个限制因素,通过解耦他们我能够获得收益。

现在,在磁盘读取的线程1中,我尝试了几种不同的磁盘访问方法:

  • 使用库提供的磁盘访问(Mac + Win)通过ci :: DataSourcePath
  • fread(Mac + Win),
  • CreateFile(只赢)
  • mmap(仅适用于Mac)

在OS X上,我发现使用fread(通过fcntl没有caching和预读标志)会使得使用Cinders提供的ci :: DataSourcePath对象的持续磁盘读取性能略微好一些,但是不会太多。 通过这两种方法,我几乎可以使我的Mac Book Pro的SSD读取达到大约750MB / s的饱和度。 有趣的是,内存映射文件访问(madvise)并不是那么快(400-500MB / s),但这就是我们testing的原因。

在Windows上,CreateFile,fread(没有可用的caching标志)和ci :: DataSourcePath都有类似的性能,但是,它的速度是200MB / s,而在我的硬件上应该可以达到8GB / s (是的,严重的是,我们突袭了英特尔PCI SSD)。

那太糟了!

Windows磁盘IO比我更熟悉的一些问题:

  • 研究表明,Windows CreateFile的FILE_FLAG_NO_BUFFER + FILE_FLAG_OVERLAPPED是(是?)要走的路。
  • 其他信息表明我应该使用IOCompletionPorts和asynchronousIO。
  • Boost :: ASIO是否可用于高性能,无缓冲的磁盘访问? 大多数post指出它用于套接字的东西。

我想避免太多的跨平台复杂性(重叠和asynchronousIO看起来不是微不足道的),对我来说看起来很疯狂,完全相同的x64体系结构导致如此巨大的不同的性能。 我错过了什么 – 为什么我的解耦在Windows上工作? 我应该在2015年使用哪些API?

任何build议是非常感激的。

TL; DR-经验丰富的Mac开发者对跨平台磁盘IO进行了一些基本的优化,并且在Windows中失败,Windows IO很奇怪,我应该在2015年使用哪些API来获得Windows上的快速磁盘读取?

谢谢。