Для чтения данных из сокета в python вы вызываете socket.recv
, у которого есть эта подпись:
socket.recv(bufsize[, flags])
документы python для socket.recv неопределенно:
Примечание.. Для обеспечения наилучшего соответствия аппаратным и сетевым реалиям значение bufsize должен быть относительно небольшим мощность 2, например, 4096.
Вопрос. Что означает "наилучшее соответствие аппаратным и сетевым реалиям"? Каково фактическое влияние настройки bufsize на не-два-два?
Я видел много другие , чтобы прочитать это значение 2. Я также хорошо осведомлен о причинах, когда часто бывает полезно иметь длины массивов как полномочия двух (операции бит-сдвига/маскировки по длине, оптимальный массив FFT размер и т.д.), но они зависят от приложения. Я просто не вижу общей причины для этого с socket.recv
. Разумеется, это не соответствует конкретной рекомендации в документации на python. Я также не вижу никаких оптимизаций в два раза в лежащем в основе кода python, чтобы сделать его рекомендацией для python
Например... если у вас есть протокол, в котором длина входящего пакета точно известна, очевидно, что лучше всего читать только "не более", что необходимо для пакета, с которым вы имеете дело, иначе вы могли бы следующий пакет, и это будет раздражать. Если в пакете, который я сейчас обрабатываю, осталось только 42 байта, я собираюсь установить bufsize на 42.
Что мне не хватает? Когда мне приходится выбирать произвольный размер буфера/массива, я обычно (всегда?) Делает длину равной двум, на всякий случай. Это всего лишь привычка, разработанная на протяжении многих лет. Являются ли документы python просто жертвой привычки?
Это не эксклюзивно для python, но поскольку я специально ссылаюсь на документы python, я помечаю его как таковой.
UPDATE. Я просто проверил размер буфера на уровне ядра в моей системе (или, по крайней мере, я думаю, что сделал... я сделал cat /proc/sys/net/core/rmem_default
), и это было 124928. Не сила двух. rmem_max
был 131071, также явно не сила двух.
В этом я больше не вижу никакой пользы от двух рекомендаций (рекомендаций). Я уже готов назвать это фиктивной рекомендацией...
Я также добавил теги tcp
и C
, так как они также актуальны.