2011-04-20 22 views
2

我正在用Java構建遊戲服務器。網絡將由JBoss Netty處理,如果我使用JNI調用C++函數(這些函數只是彙編代碼的封裝程序(與NASM彙編)以便完成I/O操作),我認爲可以獲得一些額外的性能和內存效率在彙編中,以及處理大量的數據。這種方法有什麼收穫嗎?我將通過JNI獲益於內存和速度嗎?

回答

5

I/O功能受到操作系統的瓶頸,並且組裝將會加速I/O,而不是而不是。一般來說,切換到C++或切換到任何低級語言都沒有。

如果要提高性能,請嘗試避免 I/O。

+0

好的,謝謝:)。但是JNI調用的本地代碼通常會更快嗎? – Benjamin 2011-04-20 09:26:45

+0

是的,很少___位。這不是因爲I/O速度更快,而是因爲變量的一般解析以及類似的東西不是通過虛擬機,而是直接通過機器代碼。雖然差異很小。 – orlp 2011-04-20 09:28:15

+1

如果有的話。不要太早進行優化,也不要低估JIT編譯器的可能性。 JIT編譯器使用哪些C++編譯器無法使用的優化可能性。因此,調用本地代碼是否真的會讓你受益匪淺。特別是如果你必須經常跨越Java代碼和本地代碼之間的邊界。 – jmg 2011-04-20 09:43:23

2

這是每個案例的基礎。如果在I/O之間,它涉及大量的計算/進程/內存訪問,Java的執行效率低於C++,那麼您肯定會獲得性能提升。在很多情況下,這是事實。

但仔細想想,性能增益是否超過了您調試某個進程的能力。如果問題出現在你的JNI調用中,將很難找出問題所在。

通常對於服務器來說,更重要的是能夠分辨問題並修復問題,而不是在推動性能方面走極端道路,因爲通過附加硬件(更快的組件,集羣,等等)不像客戶端程序,你經常被一個默認硬件困住。