Я пытался найти узкое место в моем классе и удивительно заметил, что sw.Write("m"); sw.Flush()
может быть на 20000 быстрее, чем await sw.WriteAsync("m"); Await sw.FlushAsync();
при записи 1000000 сообщений в файл. Неужели кто-нибудь знает, почему? Моя ставка - . Конструктор, принимающий String
, не параметризует поток для использования async
.StreamWriter: (Write + Flush) Async кажется намного медленнее, чем синхронные варианты
Этот код может быть запуститься c интерактивным C#. Да, это не самое лучшее место для измерения скорости, но он будет показывать этот вопрос под рукой в любом случае:
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();
Запущенный на моем домашнем ПК с C# Interactive выход
Заполненные 1000 итераций в 1 миллисекунды.
для синхронного кода и
Заполненные 1000 итераций в 43383 миллисекунд.
для асинхронного использования.
Update: Кроме того, я заметил, что программа замедляет внутри FlushAsync
. WriteAsync
работает почти с той же скоростью, что и синхронная версия.
Все комментарии могут быть отправлены.
Возможно увидеть [этот ответ] (http://stackoverflow.com/a/18335900/4372746). Кроме того, наверняка вы могли бы просто подождать два часа, чтобы сформировать полный пост? –
@ Glorin Oakenfoot спасибо за ссылку. Yeap, мой плохой, но я был обеспокоен тем, что я, вероятно, могу его забыть :-( –
Я не знаю, почему кто-нибудь будет использовать метод Async Write. Между записью Sync Write и Async Write очень мало различий. быстро он не платит, чтобы перейти к Async. – jdweng