1. 程式人生 > >Java陣列拷貝/複製的效率比較

Java陣列拷貝/複製的效率比較

今天在研究Jlibrtp程式碼時,偶然注意到裡面大量使用了System.arraycopy()這個方法,心想既然是協議實現,那用的方法肯定都是效率最高或較高的了,以前對這個System.arraycopy()僅有個抽象的認識。另外,JDK中對ArrayList的add與remove方法的實現,居然也是用的System.arraycopy(),讓我不由得對其產生“敬意啊”。今天就來動手試一下到底誰的效率高,到底有多高。

C程式設計師們經常討論陣列複製的效率,此類筆試面試題也層出不窮。在Java中,陣列拷貝可以用:1)for迴圈;2)clone方法;3)System.arraycopy()。測試如下:

(1)使用了一個70元素的字串陣列;

(2)每種方法各迴圈拷貝N次。

統計結果如下:

重複1000次

10萬

100萬

500萬

for迴圈

0

47

484

2421

clone方法

0

32

250

1235

System.arraycopy

0

16

94

437

很明顯了,for迴圈最慢,約為clone方法的2倍,約為System.arraycopy的4~5倍;System.arraycopy最快。

PS:System.arraycopy是呼叫的JNI,怪不得。

附測試程式碼:

Java程式碼 收藏程式碼
  1. package copytest;
  2. public class ArrayCopyTest
  3. {
  4. private static String [] src
  5. = {"Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
  6. "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
  7. "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
  8. "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
  9. "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
  10. "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
  11. "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
  12. "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
  13. "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff",
  14. "Aaaaaaaaaa", "Vvvvvvv", "Bbbb", "Cccc", "Dddd", "Eddeee", "FFFFFFffffffff"};
  15. private static String [] dst;
  16. /**
  17. * @param args
  18. */
  19. public static void main(String[] args)
  20. {
  21. // TODO Auto-generated method stub
  22. System.out.println(forCopy(5000000));
  23. System.out.println(cloneCopy(5000000));
  24. System.out.println(systemJNICopy(5000000));
  25. }
  26. /**
  27. * 使用for來複制陣列
  28. * @param time 迴圈執行的次數
  29. * @return 執行的總時間
  30. */
  31. public static long forCopy(int time)
  32. {
  33. long start = System.currentTimeMillis();
  34. while(time-- > 0)
  35. {
  36. int size = src.length;
  37. dst = new String [size];
  38. for (int i = 0; i < size; i++)
  39. {
  40. dst[i] = src[i];
  41. }
  42. }
  43. long end = System.currentTimeMillis();
  44. return (end - start);
  45. }
  46. public static long cloneCopy(int time)
  47. {
  48. long start = System.currentTimeMillis();
  49. while(time-- > 0)
  50. {
  51. dst = (String[])src.clone();
  52. }
  53. long end = System.currentTimeMillis();
  54. return (end - start);
  55. }
  56. public static long systemJNICopy(int time)
  57. {
  58. long start = System.currentTimeMillis();
  59. while(time-- > 0)
  60. {
  61. int size = src.length;
  62. System.arraycopy(src, 0, dst, 0, size);
  63. }
  64. long end = System.currentTimeMillis();
  65. return (end - start);
  66. }
  67. }