Je suis à la recherche de la méthode la plus efficace pour lire ligne par ligne STDIN.
La première ligne est le nombre de conditions à tester. Toutes les lignes suivantes sont des conditions (chaînes) avec un maximum de 100 000 caractères.
J'ai déjà essayé ce qui suit (plus le résultat pour 4 fois 90 000 caractères:
Scanner avec boucle 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++;
}
Scanner avec une boucle 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++;
}
BufferedReader avec une boucle 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());
}
BufferedReader avec une boucle 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());
}
Lors du débogage du temps pris, j'ai remarqué que le temps pris diminue après chaque lecture. Est-il possible de restreindre les octets qui sont initialisés (par exemple: si vous avez un maximum de 100 000 caractères, limitez le scanner/tampon de lecture à initialiser uniquement 100 000 caractères. Après une lecture, il devra se recharger avec les 100 000 caractères suivants)
Toutes les idées à ce sujet sont les bienvenues.
EDIT: Ajout du code pour chaque scénario avec le temps pris par ligne lue. Également changé de 100 000 à 100 000 pour lire plus facilement.
Regardé à l'intérieur BufferedReader#readLine
la source. Il y a plusieurs problèmes que je vois:
Vous pouvez tenter votre chance avec deux choses: