我看到过这样的问题: 两个独立的 Java 桌面应用程序之间的通信 (回答:JGroups),我正在考虑使用 JavaGroups 或直接 RMI 来实现一些东西,但速度至关重要。我不会发送大量数据(MIDI 消息的内容,因此每个 3 个字节,每三毫秒不超过两条消息),并且这些数据都将在同一台机器上。 认为同一物理机上的 RMI/JGroups 会很慢是愚蠢的吗?

(我的想法是,我无法承受超过 1 毫秒的延迟,因为我已经有了一些延迟,但我不确定如何在这种情况下最好地谈论速度。)

我想我真正的问题是: Java 中的应用程序间通信是否有比 TCP/IP 更快的选项? 我的意思是已经用 Java 实现的东西,而不是我需要实现的 JNI 可能性:)

我知道,不要过早优化等等,但安全总比后悔好。

有帮助吗?

解决方案

Java 中的应用程序间通信是否有比 TCP/IP 更快的选项?

不显着...AFAIK。

但我认为你思考这个问题的方式是错误的。假设您正在移动小消息,主要的性能杀手将是进行调用的开销,而不是移动字节的速度。这些开销包括进行系统调用、在客户端和服务器端切换进程上下文、在内核中处理消息数据包标头以及路由数据包所花费的时间。任何类似 RPC 的同步交互都需要进行调用并等待回复;IE。应用程序 -> 服务器 -> 往返时间。

获得更大吞吐量的方法是关注以下方面:

  • 减少应用程序所需的 RPC 数量;例如通过将它们组合起来变得更粗粒度,并且

  • 寻找将同步交互转变为异步交互的方法;例如使用基于消息而不是基于 RPC 的技术。

其他提示

如果速度是最重要的,你应该在同一个线程调用。使用网络,你不会得到尽可能快的了。

然而,假设速度并没有那么重要,你可以执行的Java RMI在约500微秒调用和使用自定义编码的RPC你可以在大约24微秒在环回电话。即使在相同的JVM线程之间传递数据可以采取8微秒。

您需要决定你有多少时间愿意允许把网络电话。您还需要决定是否启动呼叫的时间是关键或返回结果的时间。 (通常情况下,后者具有双重的开销)

注意:在这里,我说的微秒,不毫秒。我会忽略它需要你的目的多毫秒的任何选项。

这个基准是大约两年老了,但它表明,只有流行的Java远程访问解决方案比RMI更快黑森州2 (仍处于公测我相信)。

然而,如果您的消息仅在单一的数字字节,使用任何远程处理溶液似乎是矫枉过正,尤其是如果该过程是在同一台机器上。我建议他们整合成一个单一的过程,如果可能的。你也可以考虑只用普通的Java套接字

  

是不是愚蠢地认为在同一个物理机器上的RMI / JGroups的将是缓慢?

如果您的机器是体面或许是肯定的:)如果你的机器上万吨吃CPU等流程运行,那么事情可能会有所不同。作为永远是最好的办法,找出您是否遇到同样的事情,我是来测试它。

以下是在相同的JVM使用nanoTime采取以毫秒为单位的时间 发送字符串“123”使用RMI和服务器上的concat它与“ABC”获得 则 “123abc” 并返回它。

冷JVM:大约0.25毫秒的延迟

0.250344
0.262695
0.241540
0.282461
0.301057
0.307938
0.282102

暖JVM:约0.07毫秒的延迟

0.87916
0.72474
0.73399
0.64692
0.62488
0.59958
0.59814
0.66389

所以,你会如果RMI服务器和客户端在本地运行1毫秒内很好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top