【问题标题】:Java readline() performance differs on subsequent testsJava readline() 性能在后续测试中有所不同
【发布时间】:2015-07-13 16:48:09
【问题描述】:

我编写了一个程序来使用一个简单的缓冲阅读器从一个简单的 1GB 文件中读取内容。

我记录了从开始到结束的时间,以此来计算所用的时间。

我发现一个有趣的现象是,第一次运行时,读取速度大约为 80~90MB/s,但是当我第二次运行时,它的读取速度要快得多,速度约为 320MB /s.

我猜这可能是内存缓存问题的结果,但我不知道如何解决。

【问题讨论】:

  • 似乎磁盘缓存(在磁盘的物理缓存或操作系统的内存映射缓存上)导致第二次运行加速。为什么会出现这个问题?
  • 缓存、JIT 和类不必在第二次尝试时重新加载。
  • @MadConan 缓存一个类不会使您从磁盘读取的速度提高三倍。虽然这可能是一个因素,但几乎可以肯定是因为读取缓存。
  • @ChrisSprague 是的,我在最初发表评论后意识到了这一点。我编辑了它,虽然有点模糊。
  • 修复它算什么?

标签: java file caching memory io


【解决方案1】:

如果缓存是问题所在,假设您使用的是 Linux 系统,您应该可以使用 method detailed here 清除缓存。此方法需要超级用户访问权限。

【讨论】:

  • 感谢您的评论,但是如果 sudo 命令不可用,有什么方法可以解决这个问题?
  • @fTTTTT 不幸的是,由于(除其他外)访问/proc,该解决方案似乎需要超级用户访问权限。您正在使用的文件中有哪些类型的内容?如果内容是随机生成的、在其他地方跟踪的或者是空白的,您可以在每次程序调用之间删除和重新创建文件。这样一来,您读取的内容(可能)就不会保留在缓存中。
  • @fTTTTT 例如,rm testfile.txt; truncate -s 1g testfile.txt... 但是这样会丢失原始文件中的内容。
【解决方案2】:

我猜你想要做的是比较 readline 和其他一些读取 1GB 文件的方法之间的速度差异,并且你在运行 readline 几次后得到冲突的结果?

也许随机化文件内容,或者读取不同的文件。

【讨论】:

    猜你喜欢
    • 2015-05-03
    • 2020-09-13
    • 1970-01-01
    • 2015-01-09
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多