【发布时间】: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() 不应该那么费力。