performance - 本地 IPC 的平均性能测量

标签 performance sockets tcp ipc rpc

我们现在正在为我们当前的项目评估不同的 IPC(或更确切地说是 RPC)方法,该项目还处于早期阶段。性能很重要,因此我们正在进行一些测量以帮助我们做出选择。我们将进行通信的进程将驻留在同一台机器上

一个单独的有效选项是完全避免 IPC(通过将一个进程的功能封装在 .NET DLL 中并让另一个进程使用它),但这是我们真正想避免的选项,因为这些两个软件是由两个独立的公司开发的,我们发现维护良好的“栅栏”非常重要,它可以成为好邻居。

我们的测试包括使用每种方法跨进程边界传递消息(其中包含各种大小的 BLOB)。这些是我们得到的数字(性能范围与消息大小范围相关):

  • 网络服务(基于 HTTP 的 SOAP):
    • 25-30 MB/s 当二进制数据编码为 Base64(默认)
    • 70-100 MB/s 当使用 MTOM 时
  • .NET Remoting(基于 TCP 的 BinaryFormatter):100-115 MB/s
  • 对照组 - DLL 方法调用 + 内存复制:800-1000 MB/s

现在,我们到处寻找这些(和其他)IPC 方法的一些平均性能数据,包括原始 TCP 环回套接字的性能,但找不到任何数据。这些数字看起来正常吗?为什么这些本地 IPC 方法的性能至少比复制内存慢 10 倍?即使使用原始套接字,我也无法获得更好的结果 - TCP 的开销有那么大吗?

最佳答案

共享内存是最快的。

生产者进程可以将其输出放入进程之间共享的内存中,并通知其他进程共享数据已更新。在 Linux 上,您自然会在同一个共享内存中放置一个互斥量和一个条件变量,以便其他进程可以等待条件变量的更新。

关于performance - 本地 IPC 的平均性能测量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4246288/

相关文章:

http - 什么控制 TCP 段是传递到传递给 accept() 的套接字还是传递给 accept() 返回的套接字?

java - Java 中的 toString 覆盖

performance - 我应该测试是否等于 1 或不等于 0?

mysql - 生成 16M 唯一随机数

r - 将数据加载到 R 的最佳文件类型(速度方面)?

c - 那么这2种socket处理方式有什么区别呢?

java - 尝试让 java 套接字程序工作,但得到 "java.net.BindException: Address already in use 6666 "

c# - 如何捕获 ExtendedSocketException?

java - 如何在javax.ws.rs.client中为客户端重用java中的tcp session

c++ - OSX 上 TCP_USER_TIMEOUT 的 setsockopt 选项名称是什么