这里有经验的Mac / OS X Developer,与libCinder(一个用于graphics的跨平台C ++工具包)一起工作,寻找优化Windows磁盘访问的一些指导。
我正在优化磁盘读取(大,高分辨率)图像序列的过程。 我已经在运行OS X 10.10的Mac上实现了我的优化,几乎使我的磁盘性能翻了一番,以匹配合成磁盘基准(yay)。
在Windows上testing相同的代码导致性能没有提高(boo!)
我想解释我在做什么,为什么,我理解的是什么。
我的代码的当前状态:
我的代码有4个线程:
我从testing性能和热点的方式分离我的线程,表明磁盘访问+文件解码是一个限制因素,通过解耦他们我能够获得收益。
现在,在磁盘读取的线程1中,我尝试了几种不同的磁盘访问方法:
在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比我更熟悉的一些问题:
我想避免太多的跨平台复杂性(重叠和asynchronousIO看起来不是微不足道的),对我来说看起来很疯狂,完全相同的x64体系结构导致如此巨大的不同的性能。 我错过了什么 – 为什么我的解耦在Windows上工作? 我应该在2015年使用哪些API?
任何build议是非常感激的。
TL; DR-经验丰富的Mac开发者对跨平台磁盘IO进行了一些基本的优化,并且在Windows中失败,Windows IO很奇怪,我应该在2015年使用哪些API来获得Windows上的快速磁盘读取?
谢谢。