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

IT小君   2021-12-09T03:50:26

我了解 Scanner 的用途,以及何时使用 Scanner 以及何时使用 BufferedReader。我读了一个不同的,但在一些类似的问题Scanner vs. BufferedReader

当我从输入中读取时,为什么 Scanner 这么慢? 我认为这与 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)
IT小君

上层的类/方法通常比下层的类/方法慢。
以同样的方式,您可能会问为什么搜索regular expressions
搜索String.indexOf()其实我在SO上看到过这样的问题。

你的类/方法越专业,它的性能就越好。
例如,它只做 1 件简单的事情,但可以快速高效地完成。
更通用的类/方法可以做例如 10-20 种不同的事情,因此它们
更强大,但因此它们更慢。

我在这里说的是笼统的,我没有ScannerBufferedReader我自己比较过

2021-12-09T03:50:26   回复
IT小君

除了已经说过的 Scanner 焦点是瑞士军刀之外,它非常复杂,并且在 BufferedReader 涵盖的简单情况下,额外的小工具会给它带来负担。这就像派遣航空母舰杀死一只老鼠。

2021-12-09T03:50:26   回复
IT小君

扫描仪内置函数解析 BufferedReader 刚刚读取输入的令牌。解析令牌有开销......

2021-12-09T03:50:26   回复
IT小君

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

希望我有所帮助,

加罗德

2021-12-09T03:50:27   回复
IT小君

Scanner vs. BufferedReader 中可以找到一些高投票的提示为什么 Scanner 更慢

在某些情况下,例如竞争性编程,这种性能差异可能至关重要。因此,Codeforces 有许多带有自定义更快输入解析器的帖子,例如此处此处(带有基准测试)和此处

2021-12-09T03:50:27   回复