J'essayais de trouver un goulot d'étranglement IO dans ma classe et étonnamment remarqué que sw.Write("m"); sw.Flush()
peut être 20000 plus rapide, puis await sw.WriteAsync("m"); Await sw.FlushAsync();
lors de l'écriture de 1000000 messages dans un fichier. Est-ce que, par hasard, quelqu'un sait pourquoi? Mon pari est le constructeur StreamWriter
prenant un String
ne pas paramétrer un flux pour l'utilisation async
.StreamWriter: (Write + Flush) Async semble beaucoup plus lent puis synchrone variantes
Le code ci-dessous peut être lancé à partir de C# interactif. Oui, ce n'est pas le meilleur endroit pour mesurer la vitesse, mais il montrera la question à toute façon:
var sr = new StreamWriter("G:\\file.file");
var N = 1000;
var sw = new Stopwatch();
sw.Start();
for (var i = 0; i < N; ++i)
{
sr.Write("m"); // or await sr.WriteAsync("m");
sr.Flush(); // or await sr.FlushAsync("m");
}
sw.Stop();
Console.WriteLine("Completed " + N
+ " iterations in " + sw.ElapsedMilliseconds + " milliseconds.");
sr.Close();
Lancé sur mon PC à la maison de C# Interactive la sortie est
Terminé 1000 itérations 1 millisecondes.
pour le code synchrone et
terminées 1000 itérations dans 43383 millisecondes.
pour asynchrone.
Mise à jour: J'ai aussi remarqué que le programme ralentit l'intérieur FlushAsync
. WriteAsync
fonctionne presque à la même vitesse que la version synchrone.
Tous les commentaires sont les bienvenus.
Peut-être voir [cette réponse] (http://stackoverflow.com/a/18335900/4372746). Aussi, vous auriez sûrement attendu les deux heures pour former un poste complet? –
@Glorin Oakenfoot merci pour le lien. Yeap, mon mauvais, mais j'étais inquiet que je puisse probablement l'oublier :-( –
Je ne sais pas pourquoi quelqu'un utiliserait une méthode Async Write.Il ya très peu de différence entre Sync Write et Async Write. rapidement, il ne paie pas pour aller à Async – jdweng