Bonjour,
Je cherche à faire un traitement ligne par ligne sur un flux d'entrée. Ce flux est potentiellement très long et je cherche à avoir du code très performant. Pour l'exemple, supposons que je veuille lire/écrire sur l'entrée/sortie standard.
J'ai donc écrit une boucle du style :
Cependant, cela se révèle être assez lent. Avec un traitement vide, cela m'a pris 12 secondes, alors que d'autres outils (par exemple sed) sont capables de traiter une telle entrée en 2,2 secondes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 while (s = System.Console.ReadLine()) != null do // traitement System.Console.WriteLine(s)
J'ai mesuré les performances séparément : la boucle ReadLine prend 2,5 secondes et WriteLine prend 7,9 secondes. J'ai donc essayé d'utiliser un buffer (StringBuilder, en prenant soin qu'il n'y ait jamais de réallocation) pour limiter le nombre d'appels systèmes en sortie. Cela a divisé le temps d'écriture par deux, mais j'aimerais faire mieux.
Comment obtenir des performances comparables à ce que font les programme C, au niveau des entrées/sorties ? Y a-t-il des méthodes plus efficaces que ReadLine/WriteLine pour récupérer des chaines ligne par ligne ?
Merci par avance.
Partager