- TCP
- 命名管道
哪个更糟糕:管道的系统开销还是TCP协议栈的开销?
更新的具体要求:
- 只需要本地IPC
- 大多数情况下是许多短消息
- 不需要跨平台,仅限于Linux
哪个更糟糕:管道的系统开销还是TCP协议栈的开销?
更新的具体要求:
过去,我常常使用本地域套接字来进行这种事情。我的库会判断其他进程是本地系统还是远程,并使用TCP/IP进行远程通信,使用本地域套接字进行本地通信。这种技术的好处在于对应用程序的其余部分来说,本地/远程连接是透明的。
本地域套接字使用与管道通信相同的机制,不具备TCP/IP栈开销。
我认为你不需要担心开销问题(这将非常低)。你是否使用性能分析工具确保你的应用程序瓶颈很可能是TCP开销?
无论如何,正如Carl Smotricz所说,我会选择sockets,因为将来将非常容易将应用程序分离。
.067毫秒
.042毫秒
.033毫秒
.011毫秒
使用TCP会增加更多开销 - 这将涉及将数据拆分成数据包,计算校验和和处理确认,而在同一台机器上的两个进程之间通信时都不需要。使用管道仅会将数据复制到一个缓冲区中。
需要考虑两个问题:
TCP协议:
(1) 成本更高 - 需要进行三次握手以应对(潜在的)不可靠通道。
(2) 成本更高 - IP层开销(校验和等),TCP层开销(序列号、确认、校验和等),这些都是在同一台机器上不必要的,因为通道应该是可靠的,不会引入网络相关的损害(例如数据包重排序)。
但我仍然会选择TCP,只要有意义(即取决于情况),因为它很普遍(即易于跨平台支持),在大多数情况下开销不应该是问题(即进行性能分析,不要过早优化)。
更新:如果不需要跨平台支持并且强调性能,则使用命名/域管道,因为我相信平台开发人员将优化掉处理网络级别损害所需的不必要功能。
我认为管道会更轻一些,但这只是我的猜测。
但由于管道是一个本地事物,所涉及的代码可能要简单得多。
其他人可能会告诉你尝试测量两者以找出答案。这个回答很难出错,但你可能不愿意投入时间。那就只能希望我的猜测是正确的 ;)