簡體   English   中英

如何在JAVA中實現instanceof?

[英]How instanceof is implemented inside JAVA?

現在我正在編寫一個ORM框架,非常關心性能。

在此框架中,我必須使用instanceofClass.isAssignableFrom來檢查類型兼容性。

所以我對instanceofClass.isAssignableFrom的性能有點懷疑

究竟有多緩慢?

instanceof應該更快,它是一個字節碼操作

public static void main(String[] args) {
        boolean res1 = args instanceof Object;

字節碼

ALOAD 0
INSTANCEOF java/lang/Object
ISTORE 1

相比於

boolean res2 = Object.class.isAssignableFrom(args.getClass());

字節碼

LDC Ljava/lang/Object;.class
ALOAD 0
INVOKEVIRTUAL java/lang/Object.getClass()Ljava/lang/Class;
INVOKEVIRTUAL java/lang/Class.isAssignableFrom(Ljava/lang/Class;)Z
ISTORE 2

如何在JAVA中實現instanceof?

簡短的回答是它依賴於平台。

答案很長,你應該能夠通過編寫一個使用instanceof的測試用例,在循環中運行它以確保它得到JIT編譯,然后轉儲和檢查本機代碼來了解它是如何實現的。

但是,我認為這不會特別有啟發性。 您真正想知道的是instanceofClass.isAssignableFrom是否更快。 您可以通過仔細的微基准測試來衡量這一點。

FWIW,我預測你會發現instanceof更快。 (我希望JIT編譯器能夠以無法優化反射版本的方式優化instanceof 。)

但最后,我建議你不要在這個階段浪費你的時間進行這種優化。 使用instanceof對此進行編碼,並等到您有一些分析數據告訴您instanceof使用確實是性能瓶頸。 (“關心性能”這一切都很好......但實際上,在性能成為關鍵問題之前,需要更加重要的事情才能正確。)

首先,如果你要進行微觀測試,至少要運行一個大循環和平均值,因為你的時間會看到很多噪音。
說過,是的,反思很慢。 如果你可以圍繞它設計並使用其他任何東西,那就去做吧。
例如,如果您將使用的類集很小並且事先已知,請將它們保存在Map<Class,[Something]>並在那里查找它們 - 您將需要所有子類都在該映射中,但查找將比instanceof快得多(這基本上是很多快速序列化庫避免反射的原因)
如果您不想(無法)提前構建此映射,您可以在運行時將其構建為緩存,然后每個新類只需要一次instanceOf調用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM