注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

关于java数组拷贝的性能  

2014-11-20 03:57:56|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

关于java数组拷贝的性能

分类: java 2008-11-18 09:15 6283人阅读 评论(0) 收藏 举报

javabytestringjvmjdk测试

java 提供的System.arrayCopy()方法比自己写的数组copy要快.

查看其源代码:

  1. public static native void arraycopy(Object src,? int? srcPos,
  2. ??????????????????????????????????????? Object dest, int destPos,
  3. int length);

可以看到被定义为native方法...速度比自己写的普通方法要快.

在jdk1.6中加入了新的数组拷贝方法.Arrays.copyOfRange().

其源代码:

  1. public static byte[] copyOfRange(byte[] original, int from, int to) {
  2. int newLength = to - from;
  3. if (newLength < 0)
  4. throw new IllegalArgumentException(from + " > " + to);
  5. byte[] copy = new byte[newLength];
  6. ??????? System.arraycopy(original, from, copy, 0,
  7. ???????????????????????? Math.min(original.length - from, newLength));
  8. return copy;
  9. ??? }

其实就是System.arraycopy..晕死.

别为做的测试:

  1. /*******************************************************************************
  2. *
  3. * 比较赋值与System.arraycopy谁快
  4. *
  5. * 复制的内容越多,System.arraycopy优势更明显
  6. *
  7. * Author: NeedJava
  8. *
  9. * Modified: 2007.09.16
  10. *
  11. ******************************************************************************/
  12. public final class WhoFaster
  13. {
  14. public static void main( String[] args )
  15. ? {
  16. /*/
  17. ??? int begin=100;
  18. ??? int length=12;
  19. ??? String temp="12345678901234567890"
  20. ?????????????? +"12345678901234567890"
  21. ?????????????? +"12345678901234567890"
  22. ?????????????? +"12345678901234567890"
  23. ?????????????? +"12345678901234567890"
  24. ?????????????? +"黑客帝国忍者神龟变形金刚"
  25. ?????????????? +"12345678901234567890"
  26. ?????????????? +"12345678901234567890"
  27. ?????????????? +"12345678901234567890"
  28. ?????????????? +"12345678901234567890"
  29. ?????????????? +"12345678901234567890";
  30. ??? int times=10000000;? //千万
  31. ??? /*/
  32. int begin=100;
  33. int length=120;
  34. ??? String temp="12345678901234567890"
  35. ?????????????? +"12345678901234567890"
  36. ?????????????? +"12345678901234567890"
  37. ?????????????? +"12345678901234567890"
  38. ?????????????? +"12345678901234567890"
  39. ?????????????? +"黑客帝国忍者神龟变形金刚"
  40. ?????????????? +"黑客帝国忍者神龟变形金刚"
  41. ?????????????? +"黑客帝国忍者神龟变形金刚"
  42. ?????????????? +"黑客帝国忍者神龟变形金刚"
  43. ?????????????? +"黑客帝国忍者神龟变形金刚"
  44. ?????????????? +"黑客帝国忍者神龟变形金刚"
  45. ?????????????? +"黑客帝国忍者神龟变形金刚"
  46. ?????????????? +"黑客帝国忍者神龟变形金刚"
  47. ?????????????? +"黑客帝国忍者神龟变形金刚"
  48. ?????????????? +"黑客帝国忍者神龟变形金刚"
  49. ?????????????? +"12345678901234567890"
  50. ?????????????? +"12345678901234567890"
  51. ?????????????? +"12345678901234567890"
  52. ?????????????? +"12345678901234567890"
  53. ?????????????? +"12345678901234567890";
  54. int times=1000000;? //百万
  55. //*/?
  56. char[] oldArray=temp.toCharArray();
  57. char[] newArray=null;
  58. long start=0L;
  59. ////////////////////////////////////////////////////////////////////////////
  60. //
  61. // 单纯赋值
  62. //
  63. ////////////////////////////////////////////////////////////////////////////
  64. ??? newArray=new char[length];
  65. ??? start=System.currentTimeMillis();
  66. for( int i=0; i<times; i++ )
  67. ?????? {
  68. for( int j=0; j<length; j++ )
  69. ??????????? {
  70. ????????????? newArray[j]=oldArray[begin+j];
  71. ??????????? }
  72. ?????? }
  73. ??? System.out.println( new String( newArray )+" "+( System.currentTimeMillis()-start ) );
  74. ////////////////////////////////////////////////////////////////////////////
  75. //
  76. // System.arraycopy
  77. //
  78. ////////////////////////////////////////////////////////////////////////////
  79. ??? newArray=new char[length];
  80. ??? start=System.currentTimeMillis();
  81. for( int i=0; i<times; i++ )
  82. ?????? {
  83. ???????? System.arraycopy( oldArray, begin, newArray, 0, length );
  84. ?????? }
  85. ??? System.out.println( new String( newArray )+" "+( System.currentTimeMillis()-start ) );
  86. ? }
  87. }

其结论:

在第一种情况,循环千万,一个900,一个1000,两者相差100毫秒
第二种情况就拉大了,循环千万,一个6700,一个2200,相差4500毫秒
为防止JVM将字符数组作为常量保存在内存中,我分别屏蔽运行,效果一样。
也就是说,对于很短的字符串复制,单纯赋值略快,可以忽略
对于很长的字符串复制,用单纯赋值就是脏代码

  评论这张
 
阅读(143)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017