快速获取Java输入

快速获取Java输入,java,input,Java,Input,我试图在采访街上做一个问题,我的问题与算法无关,而是与Java有关。对于这个挑战,需要从System.in获取一定数量的输入行(几十万行)。每行都有一个由两个或三个令牌组成的预期模式,因此无需进行任何验证或解析(使扫描仪无效)。我自己的算法是正确的,只占整个运行时间的一小部分(范围为5%-20%,具体取决于边缘情况) 通过一些研究和测试,我发现对于这个问题,BufferedReader类在获取这个问题的输入数据方面要比Scanner类快得多。然而,BufferedReader对于挑战来说仍然不够

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

通过一些研究和测试,我发现对于这个问题,BufferedReader类在获取这个问题的输入数据方面要比Scanner类快得多。然而,BufferedReader对于挑战来说仍然不够快。有人能给我指一篇文章或API,让我研究一种更好的获取输入的方法吗


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

如果没有任何有用的信息,我能做的就是提供一个概括的答案:

我能想到一些事情(从我的头顶):

  • 试着创建你自己的阅读器,如果不需要,甚至忘记转换成字符
  • 阅读整段文字,而不仅仅是行
  • 尽量优化缓冲区大小
  • 自己遍历字符或字节,试图找到标记
  • 优化编译器输出
  • 预编译类以快速启动
  • 使用分析器检查代码中的慢点

  • 动动脑筋,开箱思考。

    BufferedDataInputStream应该比BufferedReader快得多。

    你可以在这里找到这个罐子:。

    javadoc。

    这是这个项目的一部分


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

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