我正在收集有关JVM方法调用和使用二进制协议(换句话说,不是SOAP)进行远程方法调用之间性能差异的数据。我正在开发一个框架,在该框架中,方法调用可以由框架自行决定是本地还是远程执行,并且我想知道在什么时候评估远程方法调用是“值得”的,无论是在更快的服务器上还是在某种计算网格上执行。我知道远程调用会慢得多,因此我主要想了解数量级差异。它比本地调用慢10倍、100倍还是1,000倍?有人有这方面的数据吗?如果必要,我将编写自己的基准测试,但我希望能够重用一些现有的知识。谢谢!
我正在收集有关JVM方法调用和使用二进制协议(换句话说,不是SOAP)进行远程方法调用之间性能差异的数据。我正在开发一个框架,在该框架中,方法调用可以由框架自行决定是本地还是远程执行,并且我想知道在什么时候评估远程方法调用是“值得”的,无论是在更快的服务器上还是在某种计算网格上执行。我知道远程调用会慢得多,因此我主要想了解数量级差异。它比本地调用慢10倍、100倍还是1,000倍?有人有这方面的数据吗?如果必要,我将编写自己的基准测试,但我希望能够重用一些现有的知识。谢谢!
开发了一个低延迟的RMI(最小约20微秒),但仍比直接调用慢1000倍。如果使用普通的Java RMI(最小约500微秒),则可能慢25000倍。
注意:这只是一个非常粗略的估计,旨在让您大致了解可能会看到的差异。有许多复杂因素可能会极大地改变这些数字。根据方法执行的内容,差异可能会较小,特别是如果将RMI执行到同一进程中,如果网络相对较慢,则差异可能会更大。
此外,即使存在非常大的相对差异,它可能对整个应用程序的影响并不大。
针对我上一条评论进行详细说明...
假设您有一个GUI需要每秒轮询一些数据,并使用后台线程来执行此操作。假设使用RMI需要50毫秒,而另一种选择是直接调用本地分布式缓存的副本,只需0.0005毫秒。这似乎是一个巨大的差异,达到了100,000倍。然而,RMI调用可以提前50毫秒开始轮询,仍然每秒轮询一次,用户几乎感觉不到差异。
更重要的是,当RMI与其他方法相比较时,如果它是适合工作的正确工具,则可能更简单。
使用JMS是使用RMI的替代方案。哪种方法最好取决于您的情况。
精确回答你的问题是不可能的。执行时间比例取决于以下因素:
但总的来说,直接的JVM方法调用非常快,任何与RMI引起的序列化和网络延迟相关的操作都会增加显著的开销。查看这些数字,以便给您提供大致的开销估算:
http://surana.wordpress.com/2009/01/01/numbers-everyone-should-know/
除此之外,您需要进行基准测试。