Search code examples
javajava.util.scannerbufferedreader

Why is Scanner slower than BufferedReader when reading from input?


I understand what is Scanner good for, and also when to use Scanner and when BufferedReader. I read a different, yet in some therm similar question Scanner vs. BufferedReader

Why is Scanner so slow when I read from the input? I assume it has to do with that there is a small buffer in Scanner, but here I am lost. The original problem is from, Codechef , but I am not interested in that solution.

Here is a code example with a given input: Input:

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

And the code

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);
    }
}

If I read the same code with scanner it is slow.


Solution

  • Upper-level classes/methods are generally slower than lower-level classes/methods.
    In the same way you could ask why is searching with regular expressions slower than
    searching with String.indexOf(). Actually I've seen such questions here on SO.

    The more specialized your class/method is, the better it can perform.
    It does e.g. just 1 simple thing but does it quickly and efficiently.
    More general classes/methods do e.g. 10-20 different things, so they
    are more powerful but due to this they are slower.

    I am speaking in general here, I haven't compared Scanner and BufferedReader myself.