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

时间:2014-02-15 12:31:39

标签: java java.util.scanner bufferedreader

我理解Scanner的优点,以及何时使用Scanner和BufferedReader。 我读了一个不同但又有点类似问题Scanner vs. 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);
    }
}

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

5 个答案:

答案 0 :(得分:10)

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

您的课程/方法越专业,就越能表现出来 它确实例如只是一件简单的事情,但它快速有效地完成 更一般的类/方法例如10-20种不同的东西,所以他们
更强大,但由于这个原因,它们更慢。

我在这里发言,我没有自己比较ScannerBufferedReader

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

希望我帮忙,

贾罗德

答案 4 :(得分:0)

可以在Scanner vs. BufferedReader找到一些高度暗示的扫描仪速度较慢的提示。

在竞争性节目等某些情况下,这种性能差异可能至关重要。 因此,Codeforces有很多帖子可以自定义更快的输入解析器,例如herehere(带基准)和here