В приведенном выше примере я получаю время в оба конца ~ 65 мкс.Если я сделаю две пятерки в файловой системе, это сократится до ~ 45 мкс.Дополнительное время при использовании сокетов localhost должно быть связано с тем, что я подключаюсь к сетевому стеку.
Да, и этого следовало ожидать.
FIFO - довольно примитивный метод связи.Их состояние по сути является переменной bool.Операции чтения и записи проходят через один и тот же предварительно выделенный буфер фиксированного размера.Таким образом, ОС может оптимизировать операции и оптимизирует их.
Сокеты более сложны.У них есть полноценный TCP, конечный автомат.Буферизация является динамической и двунаправленной (recv, send буферизуются отдельно).Это означает, что когда вы записываете что-то в локальный сокет, у вас почти всегда есть какое-то динамическое управление памятью.Linux старается избегать этого в максимально возможной степени: трюки с нулевым / единичным копированием реализуются повсеместно.Тем не менее, очевидно, что поскольку вызовы должны проходить больше кода, они будут работать медленнее.
В конце концов, учитывая, сколько сокетов сравнивается с FIFO, разница в 20us, прямо скажем, говорит о том, насколько хороша производительность сокетов Linuxis.
PS 65us rtt = ~ 35us в одном направлении.1 с / 35 мкс = ~ 30 тыс. Пакетов в секунду.Для сетевого кода без оптимизаций, используя одно соединение, которое звучит примерно так.