![]() ![]() |
|
System.arraycopy比手工的for复制速度慢? | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/10/22 21:36:18 文章录入:杜斌 责任编辑:杜斌 | |
|
|
如果使用 -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)); } } |
|
![]() ![]() |