По сути, я настроил тест, чтобы определить, какой метод является самым быстрым способом получения данных с другого компьютера в моей сети для сервера с несколькими клиентами (максимум 10, минимум 1).
Я попробовал два метода, оба были выполнены в потоке / для каждого клиента и повторили чтение 10000 раз. Я рассчитал цикл от создания потоков до объединения потоков сразу после. В своих потоках я использовал эти два метода, оба использовали стандартные вызовы read (2) / write (2) и SOCK_STREAM / AF_INET:
В одном из них я опрашивал данные в моем клиенте на чтение (не блокируя) всякий раз, когда данные были доступны, и на моем сервере я мгновенно отправлял данные всякий раз, когда получал соединение. Мой поток возвратил чтение правильного количества байтов (что происходило каждый раз).
В другом случае мой клиент отправил сообщение на сервер при подключении, а мой сервер отправил сообщение моему клиенту в режиме чтения (обе стороны заблокированы здесь, чтобы сделать его более пошаговым и синхронным). Мой поток вернулся после того, как мой клиент прочитал.
Я был почти уверен, что опрос будет быстрее. Я сделал гистограмму раз, чтобы завершить потоки, и, как и ожидалось, опрос был быстрее с небольшим запасом, но в методе чтения / записи не ожидалось двух вещей. Во-первых, метод чтения / записи дал мне два разных всплеска времени. И.Е. иногда происходило событие, которое замедляло чтение / запись примерно на 0,01 микросекунды. Сначала я запустил этот тест на коммутаторе и подумал, что это может быть коллизия пакетов, но затем я запустил сервер и клиент на одном компьютере и все еще получил эти два разных всплеска времени. Кто-нибудь знает, какое событие может происходить?
С другой стороны, моя функция чтения иногда возвращала слишком много байтов, и некоторые байты были мусором. Я знаю, что потоки не гарантируют, что вы получите все данные правильно, но почему функция чтения возвращает дополнительные байты мусора?