Кажется, все говорят, что именованные каналы быстрее, чем сокеты IPC. Насколько они быстрее? Я бы предпочел использовать сокеты, потому что они могут осуществлять двустороннюю связь и очень гибкие, но я предпочту скорость гибкости, если она значительна.
linux
performance
sockets
ipc
named-pipes
user19745
источник
источник
pipe(2)
(эmkfifo(3)
?) может быть победителем, но вы не узнаете, пока не попробуете.Ответы:
Я бы посоветовал вам сначала пойти по легкому пути, тщательно изолировав механизм IPC, чтобы вы могли переходить от сокета к каналу, но я определенно сначала выберу сокет. Прежде чем выполнять превентивную оптимизацию, убедитесь, что производительность IPC является проблемой.
И если у вас возникнут проблемы из-за скорости IPC, я думаю, вам следует подумать о переходе на разделяемую память, а не на конвейер.
Если вы хотите провести некоторое тестирование скорости передачи, вам следует попробовать socat , очень универсальную программу, которая позволяет создавать практически любые типы туннелей.
источник
Наилучшие результаты вы получите с решением с общей памятью .
Именованные каналы всего на 16% лучше TCP-сокетов .
Результаты бенчмаркинга IPC :
Контрольная точка трубы:
Тест FIFO (именованные каналы):
Тест очереди сообщений:
Тест общей памяти:
Тест сокетов TCP:
Тест сокетов домена Unix:
Тест ZeroMQ:
источник
Я соглашусь с shodanex, похоже, вы преждевременно пытаетесь оптимизировать что-то, что еще не является проблемным. Если вы не знаете, что сокеты будут узким местом, я бы просто использовал их.
Многие люди, которые используют именованные каналы, находят небольшую экономию (в зависимости от того, насколько хорошо написано все остальное), но в конечном итоге получают код, который тратит больше времени на блокировку ответа IPC, чем на выполнение полезной работы. Конечно, в этом помогают неблокирующие схемы, но это может быть сложно. Потратив годы на перенос старого кода в современную эпоху, я могу сказать, что в большинстве случаев, которые я видел, ускорение почти равно нулю.
Если вы действительно думаете, что сокеты замедлят вашу работу, то выходите из ворот, используя общую память, уделяя особое внимание тому, как вы используете блокировки. Опять же, на самом деле вы можете обнаружить небольшое ускорение, но заметьте, что вы тратите его часть на ожидание блокировок взаимного исключения. Я не собираюсь выступать за поездку в futex ад (ну, не совсем ад больше в 2015 году, в зависимости от вашего опыта).
Грубый за фунт, сокеты (почти) всегда лучший способ использовать IPC пользовательского пространства под монолитным ядром ... и (обычно) самый простой в отладке и поддержке.
источник
Имейте в виду, что сокеты не обязательно означают IP (и TCP или UDP). Вы также можете использовать сокеты UNIX (PF_UNIX), которые предлагают заметное улучшение производительности по сравнению с подключением к 127.0.0.1.
источник
Как часто числа говорят больше, чем ощущение, вот некоторые данные: Pipe vs Unix Socket Performance (opendmx.net) .
Этот тест показывает разницу в скорости трубопровода примерно на 12-15%.
источник
Если вам не нужна скорость, сокеты - самый простой способ!
Если вы смотрите на скорость, самое быстрое решение - это разделяемая память, а не именованные каналы.
источник
Для двусторонней связи с именованными каналами:
Именованные каналы довольно легко реализовать.
Например, я реализовал проект на C с именованными каналами, благодаря стандартному обмену данными на основе ввода-вывода файлов (fopen, fprintf, fscanf ...), это было так просто и чисто (если это тоже нужно учитывать).
Я даже закодировал их с помощью java (я сериализовал и отправлял объекты поверх них!)
Именованные каналы имеют один недостаток:
источник
Одна проблема с сокетами заключается в том, что у них нет способа очистить буфер. Существует так называемый алгоритм Нэгла, который собирает все данные и сбрасывает их через 40 мс. Так что, если это отзывчивость, а не пропускная способность, вам может быть лучше с пайпом.
Вы можете отключить Nagle с помощью параметра сокета TCP_NODELAY, но тогда сторона чтения никогда не получит два коротких сообщения за один вызов чтения.
Так что протестируйте его, у меня ничего из этого не было, и я реализовал очереди на основе отображения памяти с мьютексом pthread и семафором в общей памяти, избегая множества системных вызовов ядра (но сегодня они уже не очень медленные).
источник
Именованные каналы и сокеты функционально не эквивалентны; сокеты предоставляют больше возможностей (для начала, они двунаправленные).
Мы не можем сказать вам, какой из них будет работать лучше, но я сильно подозреваю, что это не имеет значения.
Доменные сокеты Unix будут делать в значительной степени то же самое, что и сокеты tcp, но только на локальном компьютере и с (возможно, немного) меньшими накладными расходами.
Если сокет Unix недостаточно быстр и вы передаете много данных, подумайте об использовании разделяемой памяти между вашим клиентом и сервером (что намного сложнее в настройке).
В Unix и NT есть «именованные каналы», но они полностью различаются по набору функций.
источник
Вы можете использовать легкое решение, такое как ZeroMQ [ zmq / 0mq ]. Он очень прост в использовании и значительно быстрее розеток.
источник
nanomsg
. В любом случае, добро пожаловать и наслаждайтесь этим прекрасным местом и станьте его активным участником.