Подтвердить что ты не робот

Почему сканер работает медленнее, чем BufferedReader при чтении с ввода?

Я понимаю, для чего нужен сканер, а также когда использовать 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);
    }
}

Если я прочитал один и тот же код со сканером, он будет медленным.

4b9b3361

Ответ 1

Классы/методы верхнего уровня обычно медленнее, чем классы/методы нижнего уровня.
Точно так же вы можете спросить, почему поиск с regular expressions медленнее, чем поиск с помощью String.indexOf(). На самом деле я видел такие вопросы здесь, на SO.

Чем более специализирован ваш класс/метод, тем лучше он может выполнять.
Это, например, просто 1 простая вещь, но делает это быстро и эффективно.
Более общие классы/методы, например, 10-20 разных вещей, поэтому они
являются более мощными, но из-за этого они медленнее.

Я вообще говорю здесь, я сам не сравнивал Scanner и BufferedReader.

Ответ 2

Помимо того, что уже было сказано, Focus Scanner - это швейцарский армейский нож, он довольно сложный и в простых случаях, покрытый BufferedReader, лишние гаджеты несут его. Это как отправка авианосца, чтобы убить крысу.

Ответ 3

Встроенные функции сканера анализируют маркеры, в которых BufferedReader просто считывает входные данные. Накладные токены синтаксического анализа...

Ответ 4

Как уже упоминалось в вашем вопросе, где вы указываете другой вопрос. Сканер выполняет дополнительные задачи, такие как синтаксический анализ целых чисел и символов. Буферизованный считыватель считывает исходный ввод. То, что он читает, это то, что он дает.

Надеюсь, я помог,

Джарод

Ответ 5

Некоторые высоко оцененные подсказки, почему сканер работает медленнее, можно найти в Scanner vs. BufferedReader.

Это различие в производительности может быть критическим в некоторых случаях, например, для конкурентного программирования. Поэтому Codeforces имеет множество сообщений с пользовательскими более быстрыми входными парсерами, такими как здесь, здесь (с эталоном) и здесь.