2011-09-24 50 views
4

我收集了一些关于使用二进制协议(换句话说,不是SOAP)的JVM方法调用和远程方法调用之间性能差异的数据。我正在开发一个框架,根据框架的判断,方法调用可以是本地或远程的,我想知道在什么时候远程评估方法是“值得”的,无论是在更快的服务器还是计算某种网格。我知道远程通话会慢很多,所以我最想了解数量级差异。慢10倍,还是100倍,还是1000倍?有没有人有这方面的数据?如有必要,我会写我自己的基准,但我希望重新使用一些现有的知识。谢谢!JVM方法调用和远程调用之间的性能差异是什么?

+0

我已经不明白将这个投票为“不是真正的问题”的人* ......但是将这个投票为“不具有建设性”的人应该前往最近的收容所; )感谢OP提出的一个很酷的问题,并且像往常一样感谢Peter Lawrey,他的回答很好。 – SyntaxT3rr0r

+0

@ SyntaxT3rr0r对于duffymo和mikera所述的原因,这不是一个真正的问题。 *什么*远程方法?通过什么网络?用什么尺寸参数?本地和远程之间的差异渐近为零,远程方法执行时间越长。 – EJP

回答

3

在开发了低延迟RMI(〜20微秒最小值)之后,它仍然比直接调用慢1000倍。如果您使用普通的Java RMI(大约500微秒),则速度可能会降低25,000倍。

注意:这只是一个非常粗略的估计,可以让您大致了解您可能会看到的差异。有很多复杂的因素可以显着改变这些数字。根据方法的不同,差异可能会低得多,尤其是如果您对同一流程执行RMI,如果网络相对较慢,差异可能会更大。

此外,即使存在非常大的相对差异,也可能它在整个应用程序中没有太大差别。


要阐述我的最后评论...

比方说你有必须查询一些数据每秒的GUI,它使用一个后台线程来做到这一点。比方说,使用RMI需要50毫秒,另一种方法是直接调用本地副本的分布式缓存需要0.0005毫秒。这似乎是一个巨大的差异,100,000x。但是,RMI呼叫可能在50毫秒之前开始,仍然每秒钟轮询一次,与用户的差别几乎没有。

可能会更加重要的是什么时,RMI使用另一种方法相比,更简单(如果其对工作的工具)

另一种使用RMI使用JMS。哪一个最好取决于你的情况。

+0

这太笼统概括了。在OP下看到我的评论。 – EJP

+0

@EJP,有时最好有一些想法,而不是不知道。然而,没有上下文,一点知识可能是危险的。这些数字应该会带来很大的警告。 –

3

无法准确回答你的问题。执行时间的比率取决于以下因素:

  • 需要为远程调用序列化的参数和返回值的大小/复杂度。
  • 方法本身的执行时间
  • 网络连接

但在一般的带宽/延迟,直接JVM方法调用是非常快,任何种类的系列化的耦合网络延迟由RMI造成的负面影响将会增加很大的开销。看看这些数字给你的开销的粗略估计:

http://surana.wordpress.com/2009/01/01/numbers-everyone-should-know/

除此之外,你需要标杆。一个建议 - 确保你使用一个非常好的二进制序列化库(avro,协议缓冲区,kryo等)和一个体面的通信框架(例如Netty)。这些工具比标准的Java序列化/ io设备要好得多,并且可能比任何可以在合理的时间内编码的东西都要好。

+0

用于Netty和proto缓冲区。 – duffymo

3

没有人能告诉你答案,因为决定是否分发不是速度问题。如果是这样,你会永不进行分布式呼叫,因为它会总是比在内存中进行的相同的调用速度慢。

您分发组件,以便多个客户端可以共享它们。如果分享是重要的,那就超过了速度。

您的盈亏平衡点与分享功能的价值有关,而不是方法调用速度。

+0

你说得很好。然而,远程调用的优点在于它引入了一个新的可与当前线程并行运行的执行线程,因此当前线程可以继续运行 - 可能会调用更多远程调用 - 然后再汇总结果。使用本地线程也可以做到这一点,但可用线程数量很快就会耗尽。但我同意,单线程的执行总是会受到远程调用的影响;它只有在我们并行运行很多事情时才有意义。 –

+0

如果调用是异步的,但不是如果它是同步的。如果它调用并阻止,你的应用程序就不会去任何地方。然后有问题找出过程是否完成以及如何获得结果。我不同意你关于本地线程的观点;仍然可以选择在本地进行异步操作。我不认为这个评论是正确的。 – duffymo

+0

您可以在本地JVM内异步调用方法,但本地计算机上的核心数量可能少于可能运行该方法的潜在数百个远程主机上可用的核心数量。 –

相关问题