【问题标题】:Performance of sockets vs pipes套接字与管道的性能
【发布时间】:2010-12-25 08:52:06
【问题描述】:

我有一个 Java 程序,它使用本地主机上的套接字与 C++ 程序通信。通过使用本机操作系统管道,我能否期望获得任何性能(延迟、带宽或两者兼而有之)?我目前主要对 Windows 感兴趣,但也欢迎任何与 Unix/Linux/OSX 相关的见解。

编辑:澄清:两个程序在同一主机上运行,​​当前通过套接字进行通信,即通过 TCP/IP 连接到 localhost:。我的问题是切换到使用(本地)命名管道(Windows)或它们的 Unix 等效项(AF_UNIX 域套接字?)的潜在性能优势是什么。

【问题讨论】:

  • 如果IPC真的是瓶颈,那么使用JNI并在同一个进程中运行呢?函数调用可能比任何 IPC 都快。
  • 有几个原因。 JVM 稳定性可能是最重要的。外部代码需要能够加载不同质量的 3rd-party DLL,我不希望它们在崩溃时能够关闭 JVM。不必构建和链接 JVM 库也是一大胜利。

标签: sockets pipe named-pipes


【解决方案1】:

对于本地进程,通信管道肯定比套接字快。有一个benchmark

我认为即使套接字是灵活的,但它也会导致糟糕的代码设计。在使用管道时,它会强制您设计项目的体系结构,例如哪个进程应该是父进程,哪个进程应该是子进程以及它们如何合作(这将决定如何建立管道)并将不同的功能分配给进程。以这种方式设计的项目将具有层次结构且易于维护。

【讨论】:

    【解决方案2】:

    肯是对的。命名管道在 Windows 上肯定更快。在 UNIX 和 Linux 上,您需要 UDS 或本地管道。一样的东西,不同的名字。

    除了套接字之外的任何东西都可以更快地进行本地通信。这包括内存映射文件、本地管道、共享内存、COM 等。

    【讨论】:

    • 我很确定 Unix 域套接字与命名管道不同(在 Linux 和每个现代 UNIX 上确实存在)。
    • 哦,刚刚意识到您的意思可能是任何一个都可以接受,并且只有“本地管道”是“命名管道”的同义词。我从来没有听说过(这个页面现在在谷歌上为“linux local pipe”排名第三!)。
    • 是的,我不是很清楚。我没有提到苹果命名的“socket”,但仍然设法让它变得混乱。 :)
    • 谢谢。您碰巧没有(或不知道)或任何基准?
    • 顺便说一句:延迟与带宽的关系如何。通信模式通常是大量来回发送的小消息,因此低延迟可能比高带宽更重要。
    【解决方案3】:

    第一个谷歌搜索出现在this,它以 NT4 和 XP 为时钟,发现命名管道(这就是你的意思,对吗?)在 Windows 上更快。

    【讨论】:

    • 我很困惑。页面上的数字似乎表明命名管道比套接字,但也许我读错了数字。
    • @JesperE 再次检查一下,进行插座测试的机器的规格比管道测试的机器高出 10:1 以上,并且在管道测试台上,NIC 已达到极限,所以考虑到这一点,管道肯定更快。 (但这是对 imo 进行基准测试的一种非常糟糕的方法)
    • 这个基准测试的设计方式非常奇怪:作者拿了两对完全不同世代的计算机,使用不同的网络技术,并在一对机器上测试每种技术只要。然后,他猜测如果这些技术具有相同的性能特征,差异应该是多少。他似乎也不担心他得到的结果之一比所讨论的网络技术的理论极限高出两个数量级这一事实。我不会在该页面上得出任何结论。
    猜你喜欢
    • 2021-09-21
    • 2010-11-17
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    相关资源
    最近更新 更多