经验丰富的Mac / OS X Developer,使用libCinder,一个用于图形的跨平台C ++工具包,寻找有关优化Windows磁盘访问的一些指导。
我正在优化磁盘访问以读取(大型,高分辨率)图像序列。我在运行OS X 10.10的Mac上实现了我的优化,并且我的磁盘性能几乎翻了两番,以匹配合成磁盘基准测试(yay)。
在Windows上测试相同的代码会导致性能不提高(嘘!)
我想解释一下我在做什么,为什么,以及我理解的东西。
我的代码的当前状态:
我的代码有4个主题:
我通过这种方式将我的线程与测量性能和热点分开,表明磁盘访问+文件解码是一个限制因素,通过解耦它们我能够获得收益。
现在,在磁盘读取的线程1中,我尝试了几种不同的磁盘访问方法:
在OS X上,我看到使用fread(没有缓存和通过fcntl的预读标志)导致使用Cinder提供的ci :: DataSourcePath对象稍微好一点的持续磁盘读取性能,但不是很多。我几乎可以通过这两种方法使我的Mac Book Pro的SSD读数大致达到750MB / s。有趣的是内存映射文件访问(使用madvise)并不是那么快(400-500MB / s),但这就是我们基准测试的原因。
在Windows上,CreateFile,fread(没有我没有知道缓存的标志)和ci :: DataSourcePath都会产生类似的性能,但是,它的200MB / s,在我的硬件上应该可以接近8GB / s(是的,严重的是,我们已经搜查了英特尔PCI固态硬盘)。
那很惨!
对于比Windows磁盘IO更熟悉的人的一些问题:
我想避免过多的跨平台复杂性(重叠和异步IO似乎非常重要),而且我觉得完全相同的x64架构会导致如此截然不同的性能。我错过了什么 - 为什么我的解耦在Windows上工作?我应该在2015年使用什么API?
非常感谢任何建议。
TL; DR - 经验丰富的Mac开发人员尝试对跨平台磁盘IO进行一些基本优化,但在Windows上失败,Windows IO很奇怪,我应该在2015年使用什么API来获取Windows上的快速磁盘读取?
感谢。