簡體   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