java - 直接访问对象 = 比从文件读取快 94,117 倍?

标签 java performance file object cpu

我编写了一个小类,它基本上从 CSV 文件中检索数据并将其加载到 POJO 对象中。由于我需要频繁访问这些数据,所以我编写了一个单例类来检查数据是否已在对象中,如果是,它只需直接从对象返回数据(无需再次从文件中获取数据)。否则,它从文件中检索数据并将数据存储在对象中以供将来查询。

在测试时,我注意到访问数据 10,000 次(包括第一次从文件加载数据)大约需要 175 毫秒。

让我印象深刻的是,当我循环 20,000 次时,只花了 177 毫秒(比 10,000 次只多了两毫秒),而循环 50,000 次只花了大约 197 毫秒。

50K 比 10K 快得多的解释是什么?为什么时间没有按比例增加?

另外,为什么直接从对象访问数据比从磁盘访问数据快得多(当我通过文件访问它时,单次大约需要 160 毫秒)

谢谢

更新:

也许更令人困惑的是,当我尝试使用两个不同的 key 访问该对象时(这需要从文件中读取两次),它所花费的时间与访问一次的时间大致相同(有 1 毫秒的变化)。所有关于对象访问比文件访问快 200K 倍的解释都只解释了我的第一个观察结果,但现在我实际上正在从两个不同的文件读取数据,但我没有看到所需时间的成比例增加。

换句话说,这样做:

    for (int counter = 0; counter < 1; counter++) {

        POJOObj.getInstance().getKey("Key1", "Val1");

    }

与执行此操作花费的时间相同:

for (int counter = 0; counter < 1; counter++) {

        POJOObj.getInstance().getKey("Key1", "Val1");
        POJOObj.getInstance().getKey("Key1", "Val2"); // this requires new read from file

    }

为什么时间没有按比例增加?

最佳答案

与从内存中读取数据相比,从磁盘读取文件要慢得多。有一个非常好的资源,名为“Latency Numbers Every Developer Should Know”,它解释了部分内容。本质上,从磁盘读取 1MB 比从主内存读取 1MB 慢大约 200,000 倍。

至于为什么你的方法的响应时间更快 - Hotspot(JVM的内部编译器)可能已经启动了。当你在Java中频繁执行一个方法时,JVM会在某个阈值后检测到这一点(我想说这是大约 10k 次调用,但不要相信我)并优化该方法。它通过将您正在执行的解释字节码转换为内联程序集来实现此目的。这要快得多,并且发生在幕后。编写像您这样的微基准测试非常困难,并且有很多方法可以搞砸它。查看this resource如果您有兴趣进一步探索这些数字,请参阅 Oracle 提供的一些陷阱以及如何使用名为 JMH 的工具来避免这些陷阱。

关于java - 直接访问对象 = 比从文件读取快 94,117 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52068276/

相关文章:

c - C语言读取一个TXT文件中的所有字符

Java UDP文件传输应用

linux - 为什么 bash 不能识别套接字文件的存在

java - 管理流中的 null 不匹配

c# - ASP.NET session - 大对象与许多小对象

c++ - Maybe 和 Either 单子(monad)、短路和性能

c++ - 在 32 位系统上使用 int64_t 而不是 int32_t 对性能有什么影响?

java - Android 自动搜索服务器

java - Java中对象的监视器是什么意思?为什么要用这个词?

java - Swing 计时器的问题