Как измерить производительность ожидающих асинхронных операций?
У меня есть служба Windows, которая читает из несколькихMessageQueue
экземпляров. Все эти очереди сообщений работают самостоятельноTask
для чтения сообщений. Обычно после прочтения сообщения работа базы данных ввода / вывода завершается. Я нашел статьи, утверждающие, что это хорошая идея - использовать async для операций ввода-вывода, потому что это освободит потоки. Я пытаюсь смоделировать повышение производительности при использовании асинхронных операций ввода-вывода в консольном приложении.
В моей тестовой среде у меня есть 10 очередей.GetQueues()
возвращает 10 разныхMessageQueue
экземпляров.
static void Main(string[] args)
{
var isAsync = Console.ReadLine() == "Y";
foreach (var queue in queueManager.GetQueues())
{
var temp = queue;
Task.Run(() => ReceiveMessagesForQueue(temp, isAsync));
}
while (true)
{
FillAllQueuesWithMessages();
ResetAndStartStopWatch();
while(!AllMessagesRead())
{
Thread.Sleep(10);
}
Console.WriteLine("All messages read in {0}ms", stopWatch.ElapsedMilliseconds);
}
}
static async Task ReceiveMessagesForQueue(MessageQueue queue, bool isAsync)
{
while (true)
{
var message = await Task.Factory.FromAsync<Message>(queue.BeginReceive(), queue.EndReceive);
if (isAsync)
await ProcessMessageAsync(message);
else
ProcessMessage(message);
}
}
Асинхронная обработка сообщенийИспользования ждутTask.Delay()
, поэтому должен выпустить токThread
static async Task ProcessMessageAsync(Message message)
{
await Task.Delay(1000);
BurnCpu();
}
Синхронизация обработки сообщенийждетTask.Delay()
так что не стоит выпускать токThread
static void ProcessMessage(Message message)
{
Task.Delay(1000).Wait();
BurnCpu();
}
В итоге результаты равны. Я что-то здесь упускаю?
Редактировать 1Я измеряю общее время, используяstopWatch.ElapsedMilliseconds
, Заполняю все очереди используяFillAllQueuesWithMessages()
с 10, 100, 10000 или более сообщениями.
ReceiveMessagesForQueue()
возвращаетсяTask
вместоvoid
сейчас.
Этот тест показывает мне улучшение производительности сейчас. Я должен был сделатьBurnCpu()
занять больше времени В то время какTask.Delay()
ожидается,BurnCPU()
можно использовать освобожденный поток для обработки.