[英]How instanceof is implemented inside JAVA?
現在我正在編寫一個ORM框架,非常關心性能。
在此框架中,我必須使用instanceof
和Class.isAssignableFrom
來檢查類型兼容性。
所以我對instanceof
和Class.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編譯,然后轉儲和檢查本機代碼來了解它是如何實現的。
但是,我認為這不會特別有啟發性。 您真正想知道的是instanceof
或Class.isAssignableFrom
是否更快。 您可以通過仔細的微基准測試來衡量這一點。
FWIW,我預測你會發現instanceof
更快。 (我希望JIT編譯器能夠以無法優化反射版本的方式優化instanceof
。)
但最后,我建議你不要在這個階段浪費你的時間進行這種優化。 使用instanceof
對此進行編碼,並等到您有一些分析數據告訴您instanceof
使用確實是性能瓶頸。 (“關心性能”這一切都很好......但實際上,在性能成為關鍵問題之前,需要更加重要的事情才能正確。)
首先,如果你要進行微觀測試,至少要運行一個大循環和平均值,因為你的時間會看到很多噪音。
說過,是的,反思很慢。 如果你可以圍繞它設計並使用其他任何東西,那就去做吧。
例如,如果您將使用的類集很小並且事先已知,請將它們保存在Map<Class,[Something]>
並在那里查找它們 - 您將需要所有子類都在該映射中,但查找將比instanceof快得多(這基本上是很多快速序列化庫避免反射的原因)
如果您不想(無法)提前構建此映射,您可以在運行時將其構建為緩存,然后每個新類只需要一次instanceOf調用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.