您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> JAVA >> 辅导 >> 正文    
  System.arraycopy比手工的for复制速度慢? 【注册男护士专用博客】          

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));
  }
  }

 

文章录入:杜斌    责任编辑:杜斌 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     

    联 系 信 息
    QQ:88236621
    电话:15853773350
    E-Mail:malenurse@163.com
    免费发布招聘信息
    做中国最专业男护士门户网站
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    没有相关文章
    专 题 栏 目

      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)                            【进男护士社区逛逛】
    姓 名:
    * 游客填写  ·注册用户 ·忘记密码
    主 页:

    评 分:
    1分 2分 3分 4分 5分
    评论内容:
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。