繁体   English   中英

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

[英]What is the performance difference between a JVM method call and a remote call?

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

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

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

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

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

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

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

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

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

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

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

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

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


详细说明我的最后评论......

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM