热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于java数组拷贝的性能

java提供的System.arrayCopy()方法比自己写的数组copy要快.查看其源代码:publicstaticnativevoidarraycopy(Objectsrc,

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 &#43; " > " &#43; to);
  5.         byte[] copy &#61; 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.  * 复制的内容越多&#xff0c;System.arraycopy优势更明显
  6.  *
  7.  * Author: Java
  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&#61;100; 
  18.     int length&#61;12; 
  19.     String temp&#61;"12345678901234567890"
  20.                &#43;"12345678901234567890"
  21.                &#43;"12345678901234567890"
  22.                &#43;"12345678901234567890"
  23.                &#43;"12345678901234567890"
  24.                &#43;"黑客帝国忍者神龟变形金刚"
  25.                &#43;"12345678901234567890"
  26.                &#43;"12345678901234567890"
  27.                &#43;"12345678901234567890"
  28.                &#43;"12345678901234567890"
  29.                &#43;"12345678901234567890"; 
  30.     int times&#61;10000000;  //千万
  31.     /*/
  32.     int begin&#61;100
  33.     int length&#61;120
  34.     String temp&#61;"12345678901234567890"
  35.                &#43;"12345678901234567890"
  36.                &#43;"12345678901234567890"
  37.                &#43;"12345678901234567890"
  38.                &#43;"12345678901234567890"
  39.                &#43;"黑客帝国忍者神龟变形金刚"
  40.                &#43;"黑客帝国忍者神龟变形金刚"
  41.                &#43;"黑客帝国忍者神龟变形金刚"
  42.                &#43;"黑客帝国忍者神龟变形金刚"
  43.                &#43;"黑客帝国忍者神龟变形金刚"
  44.                &#43;"黑客帝国忍者神龟变形金刚"
  45.                &#43;"黑客帝国忍者神龟变形金刚"
  46.                &#43;"黑客帝国忍者神龟变形金刚"
  47.                &#43;"黑客帝国忍者神龟变形金刚"
  48.                &#43;"黑客帝国忍者神龟变形金刚"
  49.                &#43;"12345678901234567890"
  50.                &#43;"12345678901234567890"
  51.                &#43;"12345678901234567890"
  52.                &#43;"12345678901234567890"
  53.                &#43;"12345678901234567890"
  54.     int times&#61;1000000;  //百万
  55.     //*/ 
  56.     char[] oldArray&#61;temp.toCharArray(); 
  57.     char[] newArray&#61;null
  58.     long start&#61;0L; 
  59.     
  60.     //
  61.     // 单纯赋值
  62.     //
  63.     
  64.     newArray&#61;new char[length]; 
  65.     start&#61;System.currentTimeMillis(); 
  66.     forint i&#61;0; i
  67.        {
  68.          forint j&#61;0; j
  69.             {
  70.               newArray[j]&#61;oldArray[begin&#43;j];
  71.             }
  72.        } 
  73.     System.out.println( new String( newArray )&#43;" "&#43;( System.currentTimeMillis()-start ) ); 
  74.     
  75.     //
  76.     // System.arraycopy
  77.     //
  78.     
  79.     newArray&#61;new char[length]; 
  80.     start&#61;System.currentTimeMillis(); 
  81.     forint i&#61;0; i
  82.        {
  83.          System.arraycopy( oldArray, begin, newArray, 0, length );
  84.        } 
  85.     System.out.println( new String( newArray )&#43;" "&#43;( System.currentTimeMillis()-start ) );
  86.   }

 

其结论:

在第一种情况&#xff0c;循环千万&#xff0c;一个900&#xff0c;一个1000&#xff0c;两者相差100毫秒

第二种情况就拉大了&#xff0c;循环千万&#xff0c;一个6700&#xff0c;一个2200&#xff0c;相差4500毫秒

为防止JVM将字符数组作为常量保存在内存中&#xff0c;我分别屏蔽运行&#xff0c;效果一样。

也就是说&#xff0c;对于很短的字符串复制&#xff0c;单纯赋值略快&#xff0c;可以忽略

对于很长的字符串复制&#xff0c;用单纯赋值就是脏代码


转:https://www.cnblogs.com/interdrp/archive/2010/10/20/1857083.html



推荐阅读
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • QT框架中事件循环机制及事件分发类详解
    在QT框架中,QCoreApplication类作为事件循环的核心组件,为应用程序提供了基础的事件处理机制。该类继承自QObject,负责管理和调度各种事件,确保程序能够响应用户操作和其他系统事件。通过事件循环,QCoreApplication实现了高效的事件分发和处理,使得应用程序能够保持流畅的运行状态。此外,QCoreApplication还提供了多种方法和信号槽机制,方便开发者进行事件的定制和扩展。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 深入解析:Synchronized 关键字在 Java 中对 int 和 Integer 对象的作用与影响
    深入探讨了 `Synchronized` 关键字在 Java 中对 `int` 和 `Integer` 对象的影响。尽管初看此题似乎简单,但其实质在于理解对象的概念。根据《Java编程思想》第二章的观点,一切皆为对象。本文详细分析了 `Synchronized` 关键字在不同数据类型上的作用机制,特别是对基本数据类型 `int` 和包装类 `Integer` 的区别处理,帮助读者深入理解 Java 中的同步机制及其在多线程环境中的应用。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
author-avatar
哀公家园_678
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有