Почему EAP не быстрее APM?

247
03 октября 2017, 02:57

Здравствуйте.

Моё клиент-серверное приложение написанное на языке 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 должен работать быстрее. Причём код безо всякого синтаксического сахара. Но работает медленнее.

Так и должно быть или я что-то делаю не так?

READ ALSO
Возможно ли отловить ошибку WinApi на C#?

Возможно ли отловить ошибку WinApi на C#?

Добрый вечер, товарищи!

323
Как отловить Ctrl+C в telnet приложении

Как отловить Ctrl+C в telnet приложении

Написал для одной задачки простенькую консольПодключаюсь по 500 порту из Putty, ввожу команду "tail" и получаю в бесконечном цикле вывод на экран...

241
Парсинг параметров с помощью Regex

Парсинг параметров с помощью Regex

Есть строка - ответ от веб сервера, приблизительно такого содержания

302
Гайд или пример PJSIP

Гайд или пример PJSIP

Уже достаточно долго ищу и не могу найти нормального гайда по библиотеке pjsip, для написания простенького softphoneНа сайте pjsip не информативно...

303