Почему сканер работает медленнее, чем 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);
}
}
Если я прочитал один и тот же код со сканером, он будет медленным.
Ответы
Ответ 1
Классы/методы верхнего уровня обычно медленнее, чем классы/методы нижнего уровня.
Точно так же вы можете спросить, почему поиск с regular expressions
медленнее, чем
поиск с помощью String.indexOf()
. На самом деле я видел такие вопросы здесь, на SO.
Чем более специализирован ваш класс/метод, тем лучше он может выполнять.
Это, например, просто 1 простая вещь, но делает это быстро и эффективно.
Более общие классы/методы, например, 10-20 разных вещей, поэтому они
являются более мощными, но из-за этого они медленнее.
Я вообще говорю здесь, я сам не сравнивал Scanner
и BufferedReader
.
Ответ 2
Помимо того, что уже было сказано, Focus Scanner - это швейцарский армейский нож, он довольно сложный и в простых случаях, покрытый BufferedReader, лишние гаджеты несут его. Это как отправка авианосца, чтобы убить крысу.
Ответ 3
Встроенные функции сканера анализируют маркеры, в которых BufferedReader просто считывает входные данные. Накладные токены синтаксического анализа...
Ответ 4
Как уже упоминалось в вашем вопросе, где вы указываете другой вопрос. Сканер выполняет дополнительные задачи, такие как синтаксический анализ целых чисел и символов. Буферизованный считыватель считывает исходный ввод. То, что он читает, это то, что он дает.
Надеюсь, я помог,
Джарод
Ответ 5
Некоторые высоко оцененные подсказки, почему сканер работает медленнее, можно найти в Scanner vs. BufferedReader.
Это различие в производительности может быть критическим в некоторых случаях, например, для конкурентного программирования.
Поэтому Codeforces имеет множество сообщений с пользовательскими более быстрыми входными парсерами, такими как здесь, здесь (с эталоном) и здесь.