每个人都似乎在说命名管道比插座IPC更快。 他们是如何更快的是谁? 我宁愿用插座,因为他们可以做双向交流,而且非常灵活,但会选择时速超过的灵活性,如果它是由相当数量。
Answer 1:
我建议你采用最简单的第一个,仔细分离IPC机制,这样就可以从插座改为管,但我肯定会带插座先走了。 您应该确保IPC性能是一个问题先发制人优化之前。
如果你在因为IPC速度的麻烦,我想你应该考虑切换到共享内存而不是去管。
如果你想要做一些传输速度测试,你应该尝试socat ,这是一个非常通用的程序,允许你创建几乎任何类型的隧道。
Answer 2:
我打算用shodanex同意,它看起来像你过早地想优化的东西是没有问题的。 除非你知道插座将是一个瓶颈,我只是使用它们。
很多人谁被命名管道发誓找到一点积蓄(取决于如何一切以及其他被写入),但与花费更多的时间阻断的IPC答复比它做无用功代码结束。 当然,无阻塞方案帮助这一点,但那些可能会非常棘手。 经年累月把旧代码到现代,我可以说,加速比是几乎为零的大多数我见过的病例。
如果你真的认为插座要你慢下来,然后出门用仔细注意共享内存的门你如何使用锁。 同样,在所有的现状,你会发现一个小加速,但是请注意,你是在浪费它等待互斥锁的部分。 我不会主张一趟futex的地狱 (2015年好, 不太地狱了,这取决于你的经验)。
一斤一斤,插座(几乎)总是最好的去为用户空间IPC单内核下(通常)最简单的调试和维护方式..和。
Answer 3:
请记住,插座并不一定意味着IP(和TCP或UDP)。 您还可以使用Unix套接字(PF_UNIX),它提供了一个显着的性能改进了连接到127.0.0.1
Answer 4:
由于经常,数字比说更感觉,这里有一些数据: 管VS Unix套接字性能(opendmx.net) 。
这个基准示出了用于管道快约12%至15%的速度的差。
Answer 5:
最好的结果,你会得到共享内存解决方案。
命名管道仅比TCP套接字更好的16%。
结果与获得IPC标杆 :
- 系统:Linux(Linux操作系统Ubuntu 4.4.0 x86_64的i7-6700K 4.00GHz)
- 消息:128个字节
- 消息数:1000000
管道基准:
Message size: 128
Message count: 1000000
Total duration: 27367.454 ms
Average duration: 27.319 us
Minimum duration: 5.888 us
Maximum duration: 15763.712 us
Standard deviation: 26.664 us
Message rate: 36539 msg/s
的FIFO(命名管道)基准:
Message size: 128
Message count: 1000000
Total duration: 38100.093 ms
Average duration: 38.025 us
Minimum duration: 6.656 us
Maximum duration: 27415.040 us
Standard deviation: 91.614 us
Message rate: 26246 msg/s
消息队列基准:
Message size: 128
Message count: 1000000
Total duration: 14723.159 ms
Average duration: 14.675 us
Minimum duration: 3.840 us
Maximum duration: 17437.184 us
Standard deviation: 53.615 us
Message rate: 67920 msg/s
共享内存基准:
Message size: 128
Message count: 1000000
Total duration: 261.650 ms
Average duration: 0.238 us
Minimum duration: 0.000 us
Maximum duration: 10092.032 us
Standard deviation: 22.095 us
Message rate: 3821893 msg/s
TCP套接字基准:
Message size: 128
Message count: 1000000
Total duration: 44477.257 ms
Average duration: 44.391 us
Minimum duration: 11.520 us
Maximum duration: 15863.296 us
Standard deviation: 44.905 us
Message rate: 22483 msg/s
Unix域套接字基准:
Message size: 128
Message count: 1000000
Total duration: 24579.846 ms
Average duration: 24.531 us
Minimum duration: 2.560 us
Maximum duration: 15932.928 us
Standard deviation: 37.854 us
Message rate: 40683 msg/s
ZeroMQ基准:
Message size: 128
Message count: 1000000
Total duration: 64872.327 ms
Average duration: 64.808 us
Minimum duration: 23.552 us
Maximum duration: 16443.392 us
Standard deviation: 133.483 us
Message rate: 15414 msg/s
Answer 6:
如果您不需要速度,插座是要走的最简单的办法!
如果你正在寻找的是速度,最快的解决方案是共享内存,而不是命名管道。
Answer 7:
对于使用命名管道的双向通信:
- 如果你有几道工序,就可以打开两个管道的两个方向(processA2ProcessB和processB2ProcessA)
- 如果你有很多方法,你可以进出水管打开每一道工序(processAin,processAout,processBin,processBout,processCin,processCout等)
- 或者你可以去混合一如既往:)
命名管道是很容易实现的。
例如,我实现了一个项目下与命名管道,由于非标准文件输入输出基于通信(FOPEN,fprintf中,的fscanf ...),它是如此简单和干净(如果这也是一个考虑因素)。
我甚至编码它们与Java(我被序列化,并在他们发送的对象!)
命名管道有一个缺点:
- 因为它们依赖于文件系统,它们并不扩展在多台计算机一样插槽(假设共享文件系统不是一个选项)
Answer 8:
与插座的一个问题是,他们没有办法刷新缓冲区。 有一种叫做Nagle算法,其收集的所有数据和40毫秒后刷新它。 所以,如果它的响应速度和不受带宽你可能是用管子更好。
您可以使用套接字选项TCP_NODELAY禁用Nagle但随后读出端将永远不会收到一个单一的读取调用两条短消息。
所以测试了一下,我结束了这一切都不及实现内存映射与并行线程互斥和共享内存信号灯基于队列,避免了很多内核的系统调用(但今天他们不是很慢了)。
Answer 9:
命名管道和套接字并不功能等效的; 插座提供更多的功能(它们是双向的,一开始)。
我们不能告诉你,这将有更好的表现,但我强烈怀疑也没关系。
Unix域套接字会做几乎什么TCP套接字会,但只能在本地计算机上,并用(或许有点)较低的开销。
如果Unix套接字是不够快,你要转移大量的数据,可以考虑使用客户端和服务器(这是很多更复杂的设置)之间共享内存。
Unix和NT都有“命名管道”,但它们在功能设置完全不同。
Answer 10:
您可以像使用ZeroMQ [轻量级的解决方案ZMQ / 0mq 。 这是非常容易使用,大大加快然后插座。