从HDD或OS缓冲区缓存或RAM DISK读取文件所花费的时间几乎相同

时间:2016-04-27 09:54:42

标签: java performance ramdisk

我有一个只读取12GB文件的java程序

 Reader reader1 = new FileReader(filePath);
        try (BufferedReader bufferedReader = new BufferedReader(reader1)) {
            String line = bufferedReader.readLine();
            while (line != null) {
                line = bufferedReader.readLine();
            }
        }

第一次阅读文件大约需要53秒。

然后我使用RAMMAP检查文件是否被缓存,文件是完全缓存的,并且它处于待机列表中。

我再次运行上述程序,这次耗时约53秒。为什么即使在OS缓冲区缓存完成文件时性能也没有提高。

我还创建了一个RAM DISK,将输入文件复制到RAM DISK中,然后再次运行上面的代码,即使现在花了大约54秒。当RAM IOPS快得多时,为什么它没有反映在这里

2 个答案:

答案 0 :(得分:1)

12GB即12,000,000,000字节的数据。假设文件中的一行平均为100字节,即120,000,000行。这意味着你的循环有1.2亿次迭代。 53秒看起来不错不是吗?

有1.2亿个线路实例需要进行垃圾回收。有大约1.2亿个readline和1.2亿个memcpys。 53秒看起来很公平,这看起来像一些不完全IO限制的代码。

BufferedReader很慢。真的很慢。请参阅此答案:Why is the performance of BufferedReader so much worse than BufferedInputStream?

答案 1 :(得分:1)

预取。

您按顺序阅读文件。您的磁盘速度足以提供12GB / 53s = 226 MB / s。在阅读完部分内容后,操作系统假设您需要越来越多,并将下一个卡盘读入内存,以便在需要时可以使用。

速度是所需CPU和所需IO时间的最大值。 CPU需要53秒,磁盘不慢。你的任务是CPU限制的。

  

当RAM IOPS快得多时,为什么它没有反映在这里。

从随机位置或许多文件中读取12GB,您将看到磁盘速度有多慢。在您的情况下,持续时间计算为最大值max(53, 1) == max(53, 53)