关于java数组拷贝的性能
来源:互联网 发布:java多线程数据共享 编辑:程序博客网 时间:2024/05/22 15:38
java 提供的System.arrayCopy()方法比自己写的数组copy要快.
查看其源代码:
- public static native void arraycopy(Object src, int srcPos,
- Object dest, int destPos,
- int length);
可以看到被定义为native方法...速度比自己写的普通方法要快.
在jdk1.6中加入了新的数组拷贝方法.Arrays.copyOfRange().
其源代码:
- public static byte[] copyOfRange(byte[] original, int from, int to) {
- int newLength = to - from;
- if (newLength < 0)
- throw new IllegalArgumentException(from + " > " + to);
- byte[] copy = new byte[newLength];
- System.arraycopy(original, from, copy, 0,
- Math.min(original.length - from, newLength));
- return copy;
- }
其实就是System.arraycopy..晕死.
别为做的测试:
- /*******************************************************************************
- *
- * 比较赋值与System.arraycopy谁快
- *
- * 复制的内容越多,System.arraycopy优势更明显
- *
- * Author: NeedJava
- *
- * Modified: 2007.09.16
- *
- ******************************************************************************/
- public final class WhoFaster
- {
- public static void main( String[] args )
- {
- /*/
- int begin=100;
- int length=12;
- String temp="12345678901234567890"
- +"12345678901234567890"
- +"12345678901234567890"
- +"12345678901234567890"
- +"12345678901234567890"
- +"黑客帝国忍者神龟变形金刚"
- +"12345678901234567890"
- +"12345678901234567890"
- +"12345678901234567890"
- +"12345678901234567890"
- +"12345678901234567890";
- int times=10000000; //千万
- /*/
- int begin=100;
- int length=120;
- String temp="12345678901234567890"
- +"12345678901234567890"
- +"12345678901234567890"
- +"12345678901234567890"
- +"12345678901234567890"
- +"黑客帝国忍者神龟变形金刚"
- +"黑客帝国忍者神龟变形金刚"
- +"黑客帝国忍者神龟变形金刚"
- +"黑客帝国忍者神龟变形金刚"
- +"黑客帝国忍者神龟变形金刚"
- +"黑客帝国忍者神龟变形金刚"
- +"黑客帝国忍者神龟变形金刚"
- +"黑客帝国忍者神龟变形金刚"
- +"黑客帝国忍者神龟变形金刚"
- +"黑客帝国忍者神龟变形金刚"
- +"12345678901234567890"
- +"12345678901234567890"
- +"12345678901234567890"
- +"12345678901234567890"
- +"12345678901234567890";
- int times=1000000; //百万
- //*/
- char[] oldArray=temp.toCharArray();
- char[] newArray=null;
- long start=0L;
- ////////////////////////////////////////////////////////////////////////////
- //
- // 单纯赋值
- //
- ////////////////////////////////////////////////////////////////////////////
- newArray=new char[length];
- start=System.currentTimeMillis();
- for( int i=0; i<times; i++ )
- {
- for( int j=0; j<length; j++ )
- {
- newArray[j]=oldArray[begin+j];
- }
- }
- System.out.println( new String( newArray )+" "+( System.currentTimeMillis()-start ) );
- ////////////////////////////////////////////////////////////////////////////
- //
- // System.arraycopy
- //
- ////////////////////////////////////////////////////////////////////////////
- newArray=new char[length];
- start=System.currentTimeMillis();
- for( int i=0; i<times; i++ )
- {
- System.arraycopy( oldArray, begin, newArray, 0, length );
- }
- System.out.println( new String( newArray )+" "+( System.currentTimeMillis()-start ) );
- }
- }
其结论:
在第一种情况,循环千万,一个900,一个1000,两者相差100毫秒
第二种情况就拉大了,循环千万,一个6700,一个2200,相差4500毫秒
为防止JVM将字符数组作为常量保存在内存中,我分别屏蔽运行,效果一样。
也就是说,对于很短的字符串复制,单纯赋值略快,可以忽略
对于很长的字符串复制,用单纯赋值就是脏代码
- 关于java数组拷贝的性能
- Java 数组 的 拷贝
- Java 数组的拷贝
- Java 数组的拷贝
- JAVA数组的拷贝
- java中数组的拷贝
- Java之数组的拷贝
- java数组的四种拷贝方法的性能分析:for、clone、System.arraycopy、Arrays.copyof
- 关于数组的浅拷贝与深拷贝
- 关于数组的复制问题------浅拷贝,深拷贝
- 关于对象/数组的深拷贝
- <Java>Java数组的深拷贝与浅拷贝
- java拷贝数组(深拷贝)
- java学习笔记-数组,对象的拷贝
- java中对数组的循环拷贝
- java数组的排序与拷贝
- Java数组拷贝/复制的效率比较
- 【Java】 数组拷贝的通用方法
- 单元测试基础知识
- Javascript escape()函数
- 云计算:拉进应用和操作之间的距离
- 六年半,真不容易,呵呵
- VB6.0读写INI文件的四个函数
- 关于java数组拷贝的性能
- 关于传递参数乱码和AJAX乱码问题
- 懵懵懂懂
- 一篇好文,在迷茫时阅读
- 第一份工作应该做什么???
- 金山词霸2009牛津版完整破解版+绿色精简版下载
- .net学习总结(7)之在IIS中不能浏览页面解决方法
- 搜索引擎的前沿技术
- PHP项目打包方法