С приведенным выше примером я получаю время в оба конца ~ 65 мкс. Если я сделаю два фикса в файловой системе, это уменьшится до ~ 45 мкс. Дополнительное время, использующее сокеты localhost, должно быть связано с тем, что я нахожусь в сетевом стеке.
Да, и этого можно ожидать.
FIFO - довольно примитивный метод общения. Их состояние по существу является переменной bool. Чтения и записи проходят через один и тот же предварительно выделенный буфер фиксированного размера. Таким образом, ОС может и оптимизирует операции.
Розетки более сложные. У них есть полноценный конечный автомат TCP. Буферизация динамическая и двунаправленная (recv, send буферируются отдельно). Это означает, что когда вы пишете что-то в локальном сокете, вы почти всегда имеете какое-то управление динамической памятью. Linux пытается избежать этого как можно больше: трюки с нулевой копией/однократной копией реализуются повсеместно. Тем не менее, очевидно, что, поскольку звонки должны проходить через дополнительный код, они будут медленнее.
В конце концов, учитывая, насколько больше сокетов сравнивается с FIFO, разница 20us откровенно - это утверждение о том, насколько хороша производительность сокета Linux.
P.S. 65us rtt = ~ 35us в одном направлении. 1s/35us = ~ 30K пакетов в секунду. Для сетевого кода без оптимизации, используя одно соединение, которое звучит правильно.
Вы используете ядро на основе 2.4? Это часть проблемы. –
Да, я также все еще использую проигрыватель;) Знаете ли вы, что если более поздняя версия ядра будет оптимизировать сетевой трафик по-другому? – Jonathan
Возможно, нет, не могли бы вы объяснить, почему использование именованных каналов не подходит? Вы пытались использовать UDP вместо TCP? (DatagramSocket) – Ivan