Самый быстрый способ построчного чтения STDIN?

Я ищу наиболее эффективный по времени способ чтения STDIN построчно.

Первая строка - это количество условий для проверки. Все следующие строки являются условиями (строками) длиной не более 100 000 символов.

Я уже пробовал следующее (плюс результат для 4 раз по 90 000 символов:

  • Сканер с циклом while (7255 мс)

     Scanner sc = new Scanner (System.in);
    int numberOfLines = Integer.parseInt (sc.nextLine ());
    длинный старт = 0;
    int я = 1;
    while (i <= numberOfLines) {
    start = System.currentTimeMillis ();
    sc.nextLine ();
    Debug.println ((System.currentTimeMillis () - start) + «мс для сканера пока»);
    я ++;
    }
    
    • Результаты:
      1. 3228 мс для сканера, в то время как
      2. 2264 мс для сканера, в то время как
      3. 1309 мс для сканера, в то время как
      4. 454 мс для сканера, в то время как
  • Сканер с циклом for (7078 мс)

     Scanner sc = new Scanner ( System.in);
    int numberOfLines = Integer.parseInt (sc.nextLine ());
    длинный старт = 0;
    for (int i = 1; i <= numberOfLines; i ++) {
    start = System.currentTimeMillis ();
    sc.nextLine ();
    Debug.println ((System.currentTimeMillis () - start) + «мс для сканера для»);
     // i ++;
    }
    
    • Результатов:
      1. 3168 мс для сканера для
      2. 2207 мс для сканера для
      3. 1236 мс для сканера для
      4. 467 мс для сканера для
  • BufferedReader с циклом for (7403 мс)

     try {
    BufferedReader br = новый BufferedReader (новый InputStreamReader (System.в));
    int numberOfLines = Integer.parseInt (br.readLine ());
    длинный старт = 0;
    for (int i = 0; i 

    }

    • Результаты:
      1. 3273 мс для чтения буфера для
      2. 2330 мс для чтения с буфера для
      3. 1293 мс для чтения с буфера для
      4. 507 мс для чтения с буфера для
  • BufferedReader с циклом while (7461 мс)

     try {
    BufferedReader br = новый BufferedReader (новый InputStreamReader (System.in));
    int numberOfLines = Integer.parseInt (br.readLine ());
    int я = 0;
    длинный старт = 0;
    while (i 

    }

    • Результатов:
      1. 3296 мс для буфера чтения, в то время как
      2. 2358 мс для чтения с буфером,
      3. 1307 мс для чтения с буфера, а
      4. 500 мс для чтения с буфером, в то время как

При отладке затраченного времени я заметил, что время, затрачиваемое на чтение, уменьшается после каждого чтения. Можно ли ограничить инициализируемые байты (например, если у вас есть максимум 100000 символов, ограничьте сканер / буферизатор для инициализации только 100 000 символов. После чтения ему необходимо будет заполнить себя следующими 100 000 символов)

Любые идеи по этому поводу более чем приветствуются.

РЕДАКТИРОВАТЬ: Добавлен код для каждого сценария с указанием времени, затрачиваемого на чтение строки. Также поменял 100.От 000 до 100 000, чтобы было легче читать.

20
задан try-catch-finally 9 August 2017 в 20:32
поделиться