Warum ist Scanner langsamer als BufferedReader beim Lesen von Eingaben?

8

Ich verstehe, was Scanner gut ist, und auch wann Scanner und wann BufferedReader zu verwenden ist. Ich lese eine andere, aber in gewisser Hinsicht ähnliche Frage Scanner vs. BufferedReader

Warum ist der Scanner so langsam, wenn ich von der Eingabe lese? Ich nehme an, es hat damit zu tun, dass es im Scanner einen kleinen Puffer gibt, aber hier bin ich verloren. Das ursprüngliche Problem ist von Codechef , aber ich bin nicht an dieser Lösung interessiert.

Hier ist ein Codebeispiel mit einer gegebenen Eingabe: Eingabe:

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

Und der Code

%Vor%

Wenn ich denselben Code mit Scanner lese, ist es langsam.

    
Gábor Csikós 15.02.2014, 12:31
quelle

5 Antworten

8

Klassen / Methoden der oberen Ebene sind in der Regel langsamer als Klassen / Methoden der unteren Ebene.
Auf dieselbe Art und Weise können Sie fragen, warum die Suche mit regular expressions langsamer ist als bei
Suche mit String.indexOf() . Eigentlich habe ich solche Fragen hier auf SO gesehen.

Je spezialisierter Ihre Klasse / Methode ist, desto besser kann sie funktionieren.
Es tut z.B. nur eine einfache Sache, aber es geht schnell und effizient.
Allgemeinere Klassen / Verfahren tun z.B. 10-20 verschiedene Dinge, also sie sind kraftvoller, aber dadurch langsamer.

Ich spreche im Allgemeinen hier, ich habe Scanner und BufferedReader nicht selbst verglichen.

    
peter.petrov 15.02.2014, 12:51
quelle
1

Neben dem, was bereits gesagt wurde Scannerfokus ist ein Schweizer Taschenmesser, es ist sehr viel komplexer und in einfachen Fällen von BufferedReader abgedeckt, dass zusätzliche Gadgets es belasten. Es ist, als ob man einen Flugzeugträger schickt, um eine Ratte zu töten.

    
aalku 15.02.2014 12:50
quelle
0

Die eingebauten Funktionen des Scanners analysieren die Token, wo der BufferedReader gerade die Eingabe gelesen hat. Es gibt Overhead von Parsing-Token ...

    
Devavrata 15.02.2014 12:38
quelle
0

Wie in Ihrer Frage erwähnt, wo Sie eine andere Frage stellen. Der Scanner führt zusätzliche Aufgaben aus, z. B. das Analysieren von Ganzzahlen und Zeichen. Der gepufferte Leser liest eine Roheingabe. Was es liest, ist was es gibt.

Ich hoffe, ich habe geholfen,

Jarod

    
TheBrenny 15.02.2014 12:42
quelle
0

Einige gut gewählte Tipps, warum Scanner langsamer ist, finden Sie in Scanner vs. BufferedReader .

Dieser Leistungsunterschied kann in einigen Fällen wie der Wettbewerbsprogrammierung kritisch sein. Daher hat Codeforces zahlreiche Beiträge mit benutzerdefinierten schnelleren Eingabe-Parsern wie hier , hier (mit Benchmark) und hier .

    
Vadzim 13.06.2017 21:02
quelle