Возможный дубликат:
boost :: async_write занимает слишком много времени
В моем серверном приложении я запускаю службу asio в одном из них, чтобы обработать около 100 соединений. Я обнаружил, что async_write () иногда занимает слишком много времени, около 15 мс. (Пакет очень маленький)
У меня вопрос, почему async_write () занимает так много времени? Я думаю, что async_write () должен вернуться немедленно. Так медленно, трудно отправить много данных.
Я имею в виду, что функция не вернется сразу. Я не сказал, что отправка не завершена немедленно. 15 мс слишком долго для синхронной функции. И приложение действительно заблокировано. (все равно GetTickCount)
Тестирование кода, как это:
uint64_t TStart = 0, TEnd = 0;
TStart = GetTickCount();
async_write(*this->m_Socket,
boost::asio::buffer(pSendData->m_buf.GetBuffer(), pSendData->m_buf.GetSize()),
boost::bind(&SttSocketConnection::OnSended, this,
pSendData, placeholders::error, placeholders::bytes_transferred));
TEnd = GetTickCount();
if (TEnd - TStart > 1) {
__asm int 3;
TStart = TEnd;
}
Звучит так, как будто вы где-то переключаете контекст. 15 мс — квант планирования на многопроцессорной машине с Windows.
Если это не всегда происходит очень часто, не беспокойтесь об этом, вы просто столкнулись с переключением контекста, когда сделали системный вызов.
Если у вас есть проблема при каждом вызове, вы должны выполнить системные вызовы и выяснить, какой из них вызывает переключение контекста. Я видел подобные проблемы при использовании портов завершения ввода-вывода, последовательных портов и небольших тайм-аутов, когда некоторые системные вызовы всегда заканчиваются с задержкой 15 мс. Чтобы исправить это, мне пришлось реструктурировать код так, чтобы выполнение асинхронных операций не требовало таймера.
Я не знаю точно, что вызывает эту проблему с ASIO. Вы должны следить за системными вызовами и выяснить, какой из них несет задержку.
Других решений пока нет …