[英]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.