2011-09-24 105 views
4

我收集了一些關於使用二進制協議(換句話說,不是SOAP)的JVM方法調用和遠程方法調用之間性能差異的數據。我正在開發一個框架,根據框架的判斷,方法調用可以是本地或遠程的,我想知道在什麼時候遠程評估方法是「值得」的,無論是在更快的服務器還是計算某種網格。我知道遠程通話會慢很多,所以我最想了解數量級差異。慢10倍,還是100倍,還是1000倍?有沒有人有這方面的數據?如有必要,我會寫我自己的基準,但我希望重新使用一些現有的知識。謝謝!JVM方法調用和遠程調用之間的性能差異是什麼?

+0

我已經不明白將這個投票爲「不是真正的問題」的人* ......但是將這個投票爲「不具有建設性」的人應該前往最近的收容所; )感謝OP提出的一個很酷的問題,並且像往常一樣感謝Peter Lawrey,他的回答很好。 – SyntaxT3rr0r

+0

@ SyntaxT3rr0r對於duffymo和mikera所述的原因,這不是一個真正的問題。 *什麼*遠程方法?通過什麼網絡?用什麼尺寸參數?本地和遠程之間的差異漸近爲零,遠程方法執行時間越長。 – EJP

回答

3

在開發了低延遲RMI(〜20微秒最小值)之後,它仍然比直接調用慢1000倍。如果您使用普通的Java RMI(大約500微秒),則速度可能會降低25,000倍。

注意:這只是一個非常粗略的估計,可以讓您大致瞭解您可能會看到的差異。有很多複雜的因素可以顯着改變這些數字。根據方法的不同,差異可能會低得多,尤其是如果您對同一流程執行RMI,如果網絡相對較慢,差異可能會更大。

此外,即使存在非常大的相對差異,也可能它在整個應用程序中沒有太大差別。


要闡述我的最後評論...

比方說你有必須查詢一些數據每秒的GUI,它使用一個後臺線程來做到這一點。比方說,使用RMI需要50毫秒,另一種方法是直接調用本地副本的分佈式緩存需要0.0005毫秒。這似乎是一個巨大的差異,100,000x。但是,RMI呼叫可能在50毫秒之前開始,仍然每秒鐘輪詢一次,與用戶的差別幾乎沒有。

可能會更加重要的是什麼時,RMI使用另一種方法相比,更簡單(如果其對工作的工具)

另一種使用RMI使用JMS。哪一個最好取決於你的情況。

+0

這太籠統概括了。在OP下看到我的評論。 – EJP

+0

@EJP,有時最好有一些想法,而不是不知道。然而,沒有上下文,一點知識可能是危險的。這些數字應該會帶來很大的警告。 –

3

無法準確回答你的問題。執行時間的比率取決於以下因素:

  • 需要爲遠程調用序列化的參數和返回值的大小/複雜度。
  • 方法本身的執行時間
  • 網絡連接

但在一般的帶寬/延遲,直接JVM方法調用是非常快,任何種類的系列化的耦合網絡延遲由RMI造成的負面影響將會增加很大的開銷。看看這些數字給你的開銷的粗略估計:

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

除此之外,你需要標杆。一個建議 - 確保你使用一個非常好的二進制序列化庫(avro,協議緩衝區,kryo等)和一個體面的通信框架(例如Netty)。這些工具比標準的Java序列化/ io設備要好得多,並且可能比任何可以在合理的時間內編碼的東西都要好。

+0

用於Netty和proto緩衝區。 – duffymo

3

沒有人能告訴你答案,因爲決定是否分發不是速度問題。如果是這樣,你會永不進行分佈式呼叫,因爲它會總是比在內存中進行的相同的調用速度慢。

您分發組件,以便多個客戶端可以共享它們。如果分享是重要的,那就超過了速度。

您的盈虧平衡點與分享功能的價值有關,而不是方法調用速度。

+0

你說得很好。然而,遠程調用的優點在於它引入了一個新的可與當前線程並行運行的執行線程,因此當前線程可以繼續運行 - 可能會調用更多遠程調用 - 然後再彙總結果。使用本地線程也可以做到這一點,但可用線程數量很快就會耗盡。但我同意,單線程的執行總是會受到遠程調用的影響;它只有在我們並行運行很多事情時纔有意義。 –

+0

如果調用是異步的,但不是如果它是同步的。如果它調用並阻止,你的應用程序就不會去任何地方。然後有問題找出過程是否完成以及如何獲得結果。我不同意你關於本地線程的觀點;仍然可以選擇在本地進行異步操作。我不認爲這個評論是正確的。 – duffymo

+0

您可以在本地JVM內異步調用方法,但本地計算機上的核心數量可能少於可能運行該方法的潛在數百個遠程主機上可用的核心數量。 –

相關問題