Редакция 1: очистка очевидного
В этой версии примера программы было внесено несколько очевидных изменений, которые потребуют начальных успехов в повышении производительности. Эта версия кода далека от настройки производительности, но это хороший шаг инкрементного подхода, который позволяет и проверять влияние постепенно улучшенных подходов.
Предупреждение
Этот пример приложения обеспечивает намеренно низкую производительность, чтобы проиллюстрировать возможные улучшения производительности с помощью изменений в коде. Не используйте этот пример кода в приложении; Оно предназначено только для иллюстрации.
#include <windows.h>
BYTE Set(row, col, bAlive)
{
SOCKET s = socket(...);
BYTE byRet = 0;
BYTE tmp[3];
tmp[0] = (BYTE)row;
tmp[1] = (BYTE)col;
tmp[2] = (BYTE)bAlive;
bind( s, ... );
connect( s, ... );
send( s, &tmp, 3 );
recv( s, &byRet, 1 );
closesocket( s );
return byRet;
}
Изменения в этой версии
Эта версия отражает следующие изменения:
- Удален SNDBUF=0. Удалены задержки в 200 миллисекунд из-за небуферированных отправлений и отложенных подтверждений.
- Удалено поведение отправки и отправки и получения. Это изменение устраняет задержки в 200 миллисекунд из-за нейгла и отложенных взаимодействий ACK.
- Удалено допущение с маленьким эндианом. Теперь байты находятся в порядке.
Оставшиеся проблемы
В этой версии сохраняются следующие проблемы:
- Приложение по-прежнему работает с интенсивным подключением. Так как задержки в 600 миллисекунд удалены, приложение теперь достигает постоянной скорости 12 подключений в секунду. Многие одновременные подключения теперь становятся проблемой.
- Приложение по-прежнему толстый; неизменимые ячейки по-прежнему распространяются на сервер.
- Приложение по-прежнему демонстрирует плохую потоковую передачу; 3-байтовые отправки по-прежнему являются небольшими.
- Теперь приложение отправляет 2 байта/RTT, что равно 4 КБ/с на напрямую подключенном Ethernet. Это не слишком быстро, но TIME-WAIT, скорее всего, вызовет проблемы в первую очередь.
- Накладные расходы снизились до 99,3%, что по-прежнему не является хорошим процентом накладных расходов.
Ключевые метрики производительности
Следующие ключевые метрики производительности выражаются в времени кругового пути (RTT), Goodput и издержках протокола. Описание этих терминов см. в разделе Сетевая терминология .
Эта версия отражает следующие метрики производительности:
- Время ячейки — 2×RTT
- Goodput — 2 байта/RTT
- Издержки протокола — 99,3 %
Связанные темы