我最近在玩一些基准测试,发现非常有趣的结果,我现在无法解释。这是基准:@BenchmarkMode(Mode.Throughput)@Fork(1)@State(Scope.Thread)@Warmup(iterations=10,time=1,batchSize=1000)@Measurement(iterations=10,time=1,batchSize=1000)publicclassArrayCopy{@Param({"1","5","10","100","1000"})privateintsize;privateint[]ar;@Setuppublicvoidsetup()
我知道常见的性能重构是用System.arraycopy替换简单的for。我想问一下:system.arraycopy何时开始有意义(考虑到它是本地方法调用)。抄小东西说,这是我的印象,还是不能简单地(有效地)使用arraycopy复制这样的循环:for(intj=0;j 最佳答案 使用System.arraycopy进行快速深拷贝并不难。下面是二维数组的示例:for(inti=0;i根据快速计时测试,使用它复制1000x1000二维数组100次需要40毫秒,而使用更明显的两个for循环和赋值需要1740毫秒。
在一个与JVM基于char[]实现字符串创建的方式相关的问题之后,我提到当char[]被复制到新字符串的内部时不会发生迭代,因为System.arraycopy得到最终被调用,它使用诸如memcpy之类的函数在native的、依赖于实现的级别(theoriginalquestion)复制所需的内存。我想亲自检查一下,所以我下载了Openjdk7源代码并开始浏览它。我在OpenJDKC++源代码中找到了System.arraycopy的实现,在openjdx/hotspot/src/share/vm/oops/objArrayKlass.cpp中:if(stype==bound||Kla
我在玩JMH(http://openjdk.java.net/projects/code-tools/jmh/),我偶然发现了一个奇怪的结果。我正在对制作数组浅拷贝的方法进行基准测试,我可以观察到预期结果(遍历数组是一个坏主意,并且#clone()、System#arraycopy()和Arrays#copyOf()之间没有显着差异,性能方面).除了System#arraycopy()在数组长度被硬编码时慢了四分之一...等等,什么?这怎么可能更慢?有没有人知道可能是什么原因?结果(吞吐量):#JMH1.11(released17daysago)#VMversion:JDK1.8.0_
Java的标准库似乎对方法名称使用驼峰命名法。Native函数,如nanoTime()也不异常(exception)。如果是这样,为什么System.arraycopy不是驼峰式?System.arraycopy有什么特别之处吗? 最佳答案 它在v1.0发布之前就已经在Java中了-所以我的猜测是它早于命名约定,并且在决定命名约定时在API扫描中遗漏了它。(在其他消息中,NullPointerException应该称为NullReferenceException。) 关于java-为
这对我来说是一种耻辱,但我不知道:Youshoulduseclonetocopyarrays,becausethat'sgenerallythefastestwaytodoit.正如JoshBloch在此博客中所述:http://www.artima.com/intv/bloch13.html我一直使用System.arraycopy(...)。这两种方法都是native的,所以可能没有深入了解库的来源,我无法弄清楚为什么会这样。我的问题很简单:为什么它是最快的方式?与System.arraycopy有什么区别?区别解释here,但它没有回答为什么JoshBloch认为clone()是
这对我来说是一种耻辱,但我不知道:Youshoulduseclonetocopyarrays,becausethat'sgenerallythefastestwaytodoit.正如JoshBloch在此博客中所述:http://www.artima.com/intv/bloch13.html我一直使用System.arraycopy(...)。这两种方法都是native的,所以可能没有深入了解库的来源,我无法弄清楚为什么会这样。我的问题很简单:为什么它是最快的方式?与System.arraycopy有什么区别?区别解释here,但它没有回答为什么JoshBloch认为clone()是
System.arraycopy(Objectsrc,intsrcPos,Objectdest,intdestPos,intlength)是原生方法。这个方法的时间复杂度是多少? 最佳答案 它必须遍历数组中的所有元素才能做到这一点。数组是一种独特的数据结构,您必须在初始化时指定其大小。顺序是源数组的大小,或者用大O术语来说是它的O(length)。事实上,这发生在ArrayList内部。ArrayList包装一个数组。虽然ArrayList看起来像一个动态增长的集合,但在内部它必须扩展时会执行arrycopy。
System.arraycopy(Objectsrc,intsrcPos,Objectdest,intdestPos,intlength)是原生方法。这个方法的时间复杂度是多少? 最佳答案 它必须遍历数组中的所有元素才能做到这一点。数组是一种独特的数据结构,您必须在初始化时指定其大小。顺序是源数组的大小,或者用大O术语来说是它的O(length)。事实上,这发生在ArrayList内部。ArrayList包装一个数组。虽然ArrayList看起来像一个动态增长的集合,但在内部它必须扩展时会执行arrycopy。
在复制整个数组时,我经常看到人们这样写:int[]dest=newint[orig.length];System.arraycopy(orig,0,dest,0,orig.length);但在我看来,没有理由赞成这一点:int[]dest=orig.clone();无论如何,它们都是浅拷贝。可能这些人只是没有意识到clone的存在。那么有什么理由不使用clone? 最佳答案 clone()使用自己的引用创建第一个数组的不同副本。System.arraycopy()使用JNI(JavaNativeInterface)复制一个数组(或它