我正在处理一个解析1GB文件的应用程序,并且花了大约22秒来完成解析。我试图在生产中优化i / o,应用程序需要解析更大的文件,即40GB。 我的第一次尝试当然是尝试优化std :: ifstream缓冲区并找到一些有趣的结果。
1-我的解析方法的读取大小只有4和80字节,我使用read()非格式化输入,所以我尝试了128字节到1M的缓冲区大小。我惊讶地发现128字节给出了最好的结果。甚至64字节的缓冲区大小几乎与128的性能相同。 我不知道128如何明显优于4K,也不是64字节,这比我的单次读取操作比4K或甚至512字节的性能要好得多。
2-更有趣的是,128字节缓冲区在大约14秒内解析了文件,紧接着的后续运行耗时4秒,接着1.5秒然后它稳定在0.7秒左右!
现在如果我运行另一个文件然后重试第一个文件,它会返回到14并再次减少。 我检查了多个测试文件,结果相同:在相同输入上的后续运行花费的时间要少得多。
这怎么可能?如何在0.7秒内解析1GB? 并且它不是一些奇怪的错误,测试通过。
操作系统可以将整个文件缓存在内存中吗?
我的系统是OSX 10.9.5,带有8GB RAM,xcode 5.1.1,Apple LLVM 5.1(clang)
P.S。我没有发布代码,因为它太大了,我会尝试使用示例代码重现代码。
P.S.S。尊重那些从这些数字中推断应用程序功能的人:)
修改1:
作为补充信息,该应用程序执行大约250,000次读取操作,少量内存分配和一些大多数前进的计算。