我们现在正在为我们当前的项目评估不同的 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/