una txt texto salto programa por para lineas linea leer fichero especifica como codigo archivo java performance optimization stdin

java - txt - ¿La manera más rápida para leer línea por línea STDIN?



leer una linea especifica de un txt en java (1)

Estoy buscando la forma más eficiente de leer STDIN línea por línea.

La primera línea es el número de condiciones a probar. Todas las siguientes líneas son condiciones (cadenas) con un máximo de 100 000 caracteres.

Ya he intentado lo siguiente (más el resultado de 4 por 90 000 caracteres:

  • Escáner con un bucle while (7255 ms)

    Scanner sc = new Scanner(System.in); int numberOfLines = Integer.parseInt(sc.nextLine()); long start = 0; int i = 1; while (i<=numberOfLines){ start = System.currentTimeMillis(); sc.nextLine(); Debug.println((System.currentTimeMillis()-start) + "ms for scanner while"); i++; }

    • Resultados:
      1. 3228ms para escáner mientras
      2. 2264ms para escáner mientras
      3. 1309ms para escáner mientras
      4. 454ms para escáner mientras
  • Escáner con un bucle for (7078 ms)

    Scanner sc = new Scanner(System.in); int numberOfLines = Integer.parseInt(sc.nextLine()); long start = 0; for (int i = 1; i<= numberOfLines;i++){ start = System.currentTimeMillis(); sc.nextLine(); Debug.println((System.currentTimeMillis()-start) + "ms for scanner for"); //i++; }

    • Resultados:
      1. 3168ms para escáner para
      2. 2207ms para escáner para
      3. 1236ms para escáner para
      4. 467ms para escáner para
  • BufferedReader con un bucle for (7403 ms)

    try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int numberOfLines = Integer.parseInt(br.readLine()); long start = 0; for (int i = 0; i< numberOfLines;i++){ start = System.currentTimeMillis(); br.readLine(); Debug.println((System.currentTimeMillis()-start) + "ms for bufferreader for"); //i++; } } catch (Exception e) { System.err.println("Error:" + e.getMessage());

    }

    • Resultados:
      1. 3273ms para bufferreader para
      2. 2330ms para bufferreader para
      3. 1293ms para bufferreader para
      4. 507ms para bufferreader para
  • BufferedReader con un bucle while (7461 ms)

    try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int numberOfLines = Integer.parseInt(br.readLine()); int i=0; long start = 0; while(i< numberOfLines){ start = System.currentTimeMillis(); br.readLine(); Debug.println((System.currentTimeMillis()-start) + "ms for bufferreader while"); i++; } } catch (Exception e) { System.err.println("Error:" + e.getMessage());

    }

    • Resultados:
      1. 3296ms para bufferreader mientras
      2. 2358ms para bufferreader mientras
      3. 1307ms para bufferreader mientras
      4. 500ms para bufferreader mientras

Al depurar el tiempo empleado, noté que el tiempo requerido disminuye después de cada lectura. ¿Es posible restringir los bytes que se inicializan? (Fe: si tiene un máximo de 100.000 caracteres, limite el escáner / bufferedreader para inicializar solo 100.000 caracteres. Después de una lectura, deberá rellenarse con los siguientes 100.000 caracteres).

Cualquier idea sobre este asunto es más que bienvenida.

EDITAR: Agregó el código para cada escenario junto con el tiempo tomado por línea leída. También cambió 100.000 a 100.000 para leer más fácilmente.


BufferedReader#readLine dentro de la fuente BufferedReader#readLine . Hay varios problemas que veo:

  1. Utiliza StringBuffer en lugar de StringBuilder, lo que crea una sobrecarga de sincronización.
  2. También parece haber una sobrecarga de copia de datos - no completamente seguro, mejor eche un vistazo.
  3. Objeto de monitor dedicado en BufferedReader e incluso más sobrecarga de sincronización.

Puedes arriesgarte con dos cosas:

  1. Escribir su propio almacenamiento en búfer, lo que podría ahorrar algo de tiempo en la copia doble de los datos.
  2. Escribiendo su propio método nextLine que usaría StringBuilder y revisaría los datos de origen con un ciclo simple.