每个人似乎都说命名管道比套接字IPC快。他们快多少?我更喜欢使用套接字,因为它们可以进行双向通信,并且非常灵活,但是如果速度很大,则会选择速度而不是灵活性。
每个人似乎都说命名管道比套接字IPC快。他们快多少?我更喜欢使用套接字,因为它们可以进行双向通信,并且非常灵活,但是如果速度很大,则会选择速度而不是灵活性。
Answers:
共享内存解决方案将为您带来最佳结果。
命名管道仅比TCP套接字好16%。
通过IPC基准测试获得结果:
管道基准:
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 Queue基准测试:
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
我会同意shodanex,看来您过早地尝试优化尚未出现问题的产品。除非您知道套接字将成为瓶颈,否则我只会使用它们。
许多使用命名管道发誓的人会发现有所节省(取决于其他所有内容的编写情况),但最终导致代码花费大量时间阻止IPC答复,而不是完成有用的工作。当然,非阻塞方案可以帮助实现这一点,但是这些方案可能会很棘手。我可以说,花了数年的时间将旧代码带入了现代时代,在我所看到的大多数情况下,加速几乎是零。
如果您确实认为套接字会降低速度,那么请使用共享内存出门,并特别注意如何使用锁。再次,实际上,您可能会发现速度有所提高,但是请注意,您浪费了一部分等待互斥锁。我不会主张一趟futex的地狱(当然,不是很在2015年的地狱了,这取决于你的经验)。
一磅一磅,套接字是(几乎)始终是在单片内核下进入用户空间IPC的最佳方法,并且(通常)是最容易调试和维护的。
请记住,套接字不一定表示IP(以及TCP或UDP)。您还可以使用UNIX套接字(PF_UNIX),通过与127.0.0.1的连接,可以显着提高性能。
通常,数字比感觉更重要,这里是一些数据: 管道与Unix套接字性能(opendmx.net)。
此基准显示管道的速度相差约12%至15%。
对于与命名管道的双向通信:
命名管道非常容易实现。
例如,我使用命名管道在C中实现了一个项目,这要归功于基于标准文件输入输出的通信(fopen,fprintf,fscanf ...),它是如此简单和干净(如果考虑在内)。
我什至用Java编写了代码(我正在对其进行序列化和发送对象!)
命名管道有一个缺点:
套接字的一个问题是它们没有刷新缓冲区的方法。有一种叫Nagle的算法,可以收集所有数据并在40毫秒后刷新。因此,如果是响应性而不是带宽,那么使用管道可能会更好。
您可以使用套接字选项TCP_NODELAY禁用Nagle,但是读取端永远不会在一个读取调用中收到两条短消息。
因此,对其进行测试,最终我什么都没有,并在共享内存中使用pthread互斥体和信号量实现了基于内存映射的队列,避免了很多内核系统调用(但是今天它们不再很慢了)。
命名的管道和插座在功能上不相同;套接字提供了更多功能(它们是双向的)。
我们无法告诉您哪种会更好,但是我强烈怀疑这没关系。
Unix域套接字将执行tcp套接字的几乎所有工作,但仅在本地计算机上并且开销(可能有一点)降低。
如果Unix套接字的速度不够快,并且您正在传输大量数据,请考虑在客户端和服务器之间使用共享内存(这在设置时要复杂得多)。
Unix和NT都有“命名管道”,但功能集完全不同。
您可以使用轻量级解决方案,例如ZeroMQ [ zmq / 0mq ]。它非常易于使用,并且比套接字要快得多。
nanomsg
。无论如何,欢迎并享受这个伟大的地方,并成为它的积极贡献会员。
pipe(2)
(er,?mkfifo(3)
)可能是赢家,但直到您尝试才知道。