Здравствуйте.
Моё клиент-серверное приложение написанное на языке C# использует для асинхронной передачи по сети модель APM "обёрнутую" в async/await с помощью метода FromAsync класса TaskFactory. Данный подход меня вполне устраивает, но на MSDN я прочитал, что асинхронная работа с сокетами посредством другой модели - EAP - быстрее и что данная модель рекомендуется для высокопроизводительного кода.
Прочитав, решил проверить, так ли это и написал два теста, в одном из которых тестировалась APM + async/await, а в другом - EAP без каких-либо обёрток. Оказалось, что APM лишь ненамного медленее EAP, а в некоторых случаях (при передаче больших пакетов данных более 1 Мб за раз), даже быстрее. Замеры делал с помощью библиотеки BenchmarkDotNet.
Может быть и вовсе не стоит ждать от EAP какой-то особенной производительности? Объекты SocketAsyncEventArgs для приёма и передачи данных создаю лишь раз, и использую их потом всё время пока работает тест. Память под массивы для передачи и приёма выделяю во время теста, но точно также делаю и в тесте для APM. В конце теста EAP пересоздаю объект TaskCompletionSource и так происходит, соответственно, при каждом тестовом прогоне. Но не думаю, что создание одного объекта TaskCompletionSource может как-то повлиять на результат.
Предполагал, что "голый" EAP будет обязательно быстрее APM с async/await хотя бы по причине отсутствия инфраструктуры конечного автомата сопрограмм и связанных с ним накладных расходов. Но оказалось, что модель, которая по утверждениям MSDN должна работать медленее, работает быстрее кода, который по утверждениям все того же MSDN должен работать быстрее. Причём код безо всякого синтаксического сахара. Но работает медленнее.
Так и должно быть или я что-то делаю не так?
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости