从输入读取时,为什么Scanner比BufferedReader慢?

我理解Scanner的优点,以及何时使用Scanner和BufferedReader。 我读了一个不同的,但在一些类似的问题扫描仪与BufferedReader

当我从输入中读取时,为什么Scanner这么慢? 我认为它与扫描仪中有一个小缓冲区有关,但在这里我迷路了。 原始问题来自Codechef ,但我对该解决方案不感兴趣。

这是一个给定输入的代码示例:输入:

  • 7 3
  • 1
  • 51
  • 966369
  • 7
  • 9
  • 999996
  • 1

和代码

import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] s = br.readLine().split(" "); int numberOfLines = Integer.parseInt(s[0]); int divideNumber = Integer.parseInt(s[1]); int count = 0; for (int i = 0; i < numberOfLines; i++) { String number = br.readLine(); if (number.length() < 11) { int num = Integer.parseInt(number); if (num % divideNumber == 0) { count++; } } } System.out.println(count); } } 

如果我用扫描仪读取相同的代码,则速度很慢。

高级类/方法通常比低级类/方法慢。
以同样的方式你可以问为什么用比regular expressions搜索更慢
String.indexOf()搜索。 其实我在这里看到过这样的问题。

您的类/方法越专业,它就越好。
它只做了一件简单的事情,但它快速有效地完成。
更一般的类/方法可以做10-20个不同的事情,所以它们
更强大,但由于这个原因,它们更慢。

我在这里说的一般,我没有自己比较ScannerBufferedReader

除了已经说过的Scanner专注于瑞士军刀之外,它还要复杂得多,而且在BufferedReader的简单案例中,额外的小工具会给它带来负担。 这就像发送航空母舰杀死老鼠一样。

Scanner内置函数解析BufferedReader只读取输入的标记。解析标记的开销……

正如您在问题中提到的那样,您提出了另一个问题。 扫描程序执行额外的任务,例如解析整数和字符。 缓冲读取器读取原始输入。 它的内容是它给出的东西。

希望我帮忙,

贾罗德

可以在Scanner vs. BufferedReader中找到一些高度投票的提示,为什么Scanner较慢。

在竞争性编程等某些情况下,这种性能差异可能至关重要。 因此,Codeforces有很多post都有自定义更快的输入解析器,比如这里 ( 这里有基准)和这里 。