JVM方法调用和远程调用之间的性能差异是什么?

时间:2011-09-24 12:18:14

标签: java performance jvm rmi

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

3 个答案:

答案 0 :(得分:3)

准确回答你的问题是不可能的。执行时间的比例取决于以下因素:

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

但一般情况下,直接JVM方法调用非常快,任何类型的序列化加上由RMI引起的网络延迟都会增加显着的开销。看看这些数字,可以粗略估计开销:

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

除此之外,您还需要进行基准测试。

一条建议 - 确保使用一个非常好的二进制序列化库(avro,协议缓冲区,kryo等)与一个体面的通信框架(例如Netty)。这些工具远远优于标准的Java序列化/ io工具,可能比你在合理的时间内编写代码的任何东西都要好。

答案 1 :(得分:3)

没有人可以告诉你答案,因为是否分发的决定与速度无关。如果是,那么永远不会进行分布式调用,因为它总是比在内存中进行的同一调用慢。

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

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

答案 2 :(得分:3)

开发了低延迟RMI(约20微秒),它仍然比直接呼叫慢1000倍。如果使用普通的Java RMI(最小约500微秒),它可能会慢25,000倍。

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

此外,即使存在非常大的相对差异,也可能会在整个应用程序中产生很大差异。


详细说明我的上一次评论......

假设您有一个GUI,它必须每秒轮询一些数据,并使用后台线程来执行此操作。可以说使用RMI需要50毫秒,另一种方法是对分布式缓存的本地副本进行直接方法调用需要0.0005毫秒。这似乎是一个巨大的差异,100,000x。但是,RMI调用可以提前50毫秒启动,仍然每秒轮询一次,与用户的差异几乎为零。

更重要的是,与使用其他方法相比,RMI更简单(如果它是适合工作的正确工具)

使用RMI的替代方法是使用JMS。哪个最好取决于你的情况。