2011-08-15 74 views
5

我需要確定InetSocketAddress是IPv6還是IPv4。我只能看到這樣做的兩種方法是使用instanceof運算符,或者檢查getAddress()(應返回byte[])的長度。這兩個都不太理想(instanceof很慢,getAddress必須複製數組)。確定InetSocketAddress是IPv6還是IPv4

有沒有更好的選擇?

+3

根據[this](http://stackoverflow.com/questions/103564/the-performance-impact-of-using-instanceof-in-java),'instanceof'可能不如您想象的那麼慢。就個人而言,除非你已經對你的應用程序進行了描述,並且它將instanceof報告爲運行時間的5%以上,那麼我將推遲優化'instanceof'以備後用。 –

回答

4

我認爲你不會找到比instanceof更快的東西。在這種特殊情況下,我期望JIT編譯器優化它來加載和比較一對指針;即大約5個機器指令。

但即使instanceof明顯慢於我的理解,它很可能不會對您的應用程序的整體性能產生重大影響。

我建議你只使用instanceof,只打擾優化它,如果你有堅實的證據在這一點上的瓶頸;例如根據實際工作量分析您的應用程序的證據。

1

如果你不喜歡instanceof,你可以嘗試:

Inet4Address.class.isAssignableFrom(IPtoCheck); 
Inet6Address.class.isAssignableFrom(IPtoCheck); 

我不認爲還有比instanceof或以上更快的解決方案。

+1

'instanceof'會比較慢。 JIT編譯器無法優化反射類型檢查。 –

1

與其構建InetAddress本身及其隱含的DNS開銷的開銷相比,如果instanceof中的任何一個都是微不足道的開銷。

4

更快的解決方案是比較類型。類型Inet4Address和Inet6Address是最終的,因此它們不能被分類。

Inet4Address.class == IPtoCheck.getClass(); 
Inet6Address.class == IPtoCheck.getClass(); 

測試表明,這是比快兩倍的instanceof越來越被比較不受類型,而的instanceof對Inet4和INET6性能地址是不同的。