System.arraycopy比手工的for复制速度慢? |
|
www.nanhushi.com 佚名 不详 |
现在用的是 jdk6u7 。在小数据量的情况下,还是手工 for 比较快。但是当数组大约超过 20 项的时候,System.arraycopy()就比较快一些了。当数组长度上百以后,System.arraycopy()的优势相当明显。此时clone()方法的速度也相当显眼。 如果使用 -server 模式,性能又大约有近一倍的提升。现在大家的机器的内存都大了。用java平台工具的时候,大概都可以加上 -server 。 java version "1.6.0_07" Java(TM) SE Runtime Environment (build 1.6.0_07-b06) Java HotSpot(TM) Client VM (build 10.0-b23, mixed mode, sharing) Examda提示:以下是测试结果和源代码。结果中的数字的单位是毫秒。 -------------------------------------------------------------------------------- prompt>java ArrayCopyTest short array ############ arrayClone 1328 arrayManulCopy 266 arraySysCopy 359 long array ######################## arrayClone 1359 arrayManulCopy 469 arraySysCopy 406 big array #################################### arrayClone 1735 arrayManulCopy 2015 arraySysCopy 985 huge array ################################################ arrayClone 4281 arrayManulCopy 9500 arraySysCopy 3453 mass array ############################################################ arrayClone 7375 arrayManulCopy 19297 arraySysCopy 6578 prompt>java -server ArrayCopyTest short array ############ arrayClone 359 arrayManulCopy 234 arraySysCopy 203 long array ######################## arrayClone 219 arrayManulCopy 266 arraySysCopy 203 big array #################################### arrayClone 391 arrayManulCopy 859 arraySysCopy 391 huge array ################################################ arrayClone 1828 arrayManulCopy 4250 arraySysCopy 1875 mass array ############################################################ arrayClone 3812 arrayManulCopy 8625 arraySysCopy 3844 import java.util.Date; import java.util.Random; public class ArrayCopyTest { public static void main(String[] args) { new ArrayCopyTest().arrayCopy(); } Object[] srcArray1 = { "sdfsdaf", new Date(), new Integer(200) }; Object[] srcArray2 = { "qwerasd", new Date(), new Integer(190), srcArray1, new Object(), new String[] { "aaa", "bbb" } }; Object[] srcArray3 = new Object[30]; Object[] srcArray4 = new Object[150]; Object[] srcArray5 = new Object[300]; ArrayCopyTest() { fillArray(srcArray3); fillArray(srcArray4); fillArray(srcArray5); } /** * 填充对象数组。 * @param objs 填充目标。 */
private void fillArray(Object[] objs) { for (int i = 0; i < objs.length; i = i + 10) { fillArray(objs, i); } } void fillArray(Object[] objs, int start) { objs[start++] = new Object(); objs[start++] = new Date(); objs[start++] = getRandomString(); objs[start++] = getRandomString(); objs[start++] = getRandomString(); objs[start++] = getRandomString(); objs[start++] = getRandomString(); objs[start++] = r.nextLong(); objs[start++] = getRandomString(); objs[start++] = getRandomString(); } private Random r = new Random(); /** *获取随机字符串。 * @return 随机字符串 */ String getRandomString() { StringBuffer sb = new StringBuffer(); int loop = 3 + r.nextInt(4); while (loop > 0) { loop--; sb.append((char)(97 + r.nextInt(25))); sb.append((char)(65 + r.nextInt(25))); } return sb.toString(); } void arrayCopy() { testMethod("short array\t############", srcArray1); testMethod("long array\t########################", srcArray2); testMethod("big array\t####################################", srcArray3); testMethod("huge array\t################################################", srcArray4); testMethod("mass array\t############################################################", srcArray5); } /** *成组测试。 * @param prmpt 测试提示 * @param args 测试对象数组 */ void testMethod(String prmpt, Object[] args) { int loop = 5000000; System.out.println(prmpt); arrayClone(loop, args); arrayManualCopy(loop, args); arraySysCopy(loop, args); } void arrayClone(int loop, Object[] sourceArray) { long time = System.currentTimeMillis(); for (int i = 0; i < loop; ++i) { Object[] destArray = (Object[])sourceArray.clone(); } System.out.println(" arrayClone\t" + (System.currentTimeMillis() - time)); } void arraySysCopy(int loop, Object[] sourceArray) { long time = System.currentTimeMillis(); for (int i = 0; i < loop; ++i) { Object[] destArray = new Object[sourceArray.length]; System.arraycopy(sourceArray, 0, destArray, 0, sourceArray.length); } System.out.println(" arraySysCopy\t" + (System.currentTimeMillis() - time)); } void arrayManualCopy(int loop, Object[] sourceArray) { long time = System.currentTimeMillis(); for (int i = 0; i < loop; ++i) { Object[] destArray = new Object[sourceArray.length]; for (int j = 0; j < sourceArray.length; ++j) { destArray[j] = sourceArray[j]; } } System.out.println(" arrayManulCopy\t" + (System.currentTimeMillis() - time)); } }
|
|
|
文章录入:杜斌 责任编辑:杜斌 |
|
上一篇文章: JAVA基础(myeclipse假死问题解决方法) 下一篇文章: corg.apache.jasper.JasperException解决办法 |
【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
|