天天看點

System.arraycopy

當我還年幼的時候,我很任性,複制數組也是,寫一個for循環,來回倒騰,後來長大了,就發現了System.arraycopy的好處。

為了測試倆者的差別我寫了一個簡單指派int[100000]的程式來對比,并且中間使用了nanoTime來計算時間差:

程式如下:

為了避免記憶體不穩定幹擾和運作的偶然性結果,我在一開始的時候把所有空間申明完成,并且隻之後循環10次執行,得到如下結果:

可以看出,System.arraycopy的性能很不錯,為了看看究竟這個底層是如何處理的,我找到openJDK的一些代碼留戀了一些:

System.arraycopy是一個native函數,需要看native層的代碼:

找到對應的openjdk6-src/hotspot/src/share/vm/prims/jvm.cpp,這裡有JVM_ArrayCopy的入口:

前面的語句都是判斷,知道最後的copy_array(s, src_pos, d, dst_pos, length, thread)是真正的copy,進一步看這裡,在openjdk6-src/hotspot/src/share/vm/oops/typeArrayKlass.cpp中:

這個函數之前的仍然是一堆判斷,直到最後一句才是真實的拷貝語句。

在openjdk6-src/hotspot/src/share/vm/utilities/copy.cpp中找到對應的函數:

上面的代碼展示了選擇哪個copy函數,我們選擇conjoint_jints_atomic,在openjdk6-src/hotspot/src/share/vm/utilities/copy.hpp進一步檢視:

繼續向下檢視,在openjdk6-src/hotspot/src/cpu/zero/vm/copy_zero.hpp中:

可以看到,直接就是記憶體塊指派的邏輯了,這樣避免很多引用來回倒騰的時間,必然就變快了。