【问题标题】:Taking Java Input Quickly快速获取 Java 输入
【发布时间】:2012-02-10 00:20:12
【问题描述】:

我试图在 Interview Street 上做一个问题,我的问题与算法无关,而是与 Java 相关。对于挑战,需要从 System.in 获取大量输入行(数十万行)。每行都有两个或三个标记的预期模式,因此无需进行任何验证或解析(使 Scanner 无效)。我自己的算法是正确的,只占整个运行时间的一小部分(范围为 5%-20%,具体取决于边缘情况)。

做了一些研究和测试,我发现对于这个问题,BufferedReader 类在获取这个问题的输入数据方面比 Scanner 类快得多。然而 BufferedReader 对于挑战的目的仍然不够快。谁能指出我可以研究更好的输入方式的文章或 API?

如果重要的话,我通过调用 readLine() 方法和 String split() 方法来使用 BufferedReader 来分隔标记。

【问题讨论】:

  • String.split() 使用正则表达式,这可能会产生一些不必要的开销。或者可能不会。有趣的是,您的代码中真正的瓶颈在哪里。您是否尝试增加BufferedReader 中的缓冲区大小?如果有,对性能有影响吗?
  • 您使用的是 BufferedInputStream 吗?我们需要更多信息
  • 出于测试目的,我正在使用 BufferedReader 和 FileReader 从文件中读取数据,因为对于 BufferedReader 和 InputStreamReader,我无法足够快地手动输入数据。瓶颈似乎是在接受 500,000 个输入的边缘情况下的输入,该程序平均需要大约 130 毫秒才能完成。在运行 500,000 次的循环中注释掉除 readLine() 之外的所有内容可将运行时间减少到 110 毫秒。尽管令牌由 5 个字符串、一个 0 到 100,000 之间的整数以及可能是 0 或 1 的整数值组成,但开销明智。我认为 split() 不应该那么费力。

标签: java input


【解决方案1】:

没有任何有用的信息,我能做的最好的就是提供一个笼统的答案:http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/

【讨论】:

    【解决方案2】:

    我可以想到一些事情(从我的脑海中):

    1. 尝试创建自己的阅读器,如果不需要,甚至忘记转换为字符;
    2. 读取整个块,而不仅仅是行
    3. 尝试优化缓冲区大小;
    4. 自己遍历字符或字节,试图找到标记
    5. 优化编译器输出
    6. 预编译您的类以便快速启动
    7. 使用分析器检查代码中的慢点

    开动脑筋,跳出框框思考。

    【讨论】:

      【解决方案3】:

      BufferedDataInputStream 应该比 BufferedReader 快得多。

      你可以在这里找到罐子:http://www.jarvana.com/jarvana/view/org/apache/tika/tika-app/0.8/tika-app-0.8.jar!/nom/tam/util/BufferedDataInputStream.class?classDetails=ok

      javadoc http://skyview.gsfc.nasa.gov/jar/javadocs/nom/tam/util/BufferedDataInputStream.html.

      这是这个项目的一部分http://skyview.gsfc.nasa.gov/help/skyviewjava.html

      请注意,我从未测试过这个...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-04
        • 2019-07-17
        • 1970-01-01
        • 2017-07-20
        • 1970-01-01
        • 1970-01-01
        • 2012-08-17
        • 2018-06-29
        相关资源
        最近更新 更多