gpt4 book ai didi

java - 数组初始化 - 性能差异

转载 作者:行者123 更新时间:2023-11-30 09:02:32 24 4
gpt4 key购买 nike

如果我运行这个程序,输出是:

init: 1239.0
toCharArray: 1343.6
arraycopy: 1583.8

第一个问题是:
为什么 init()toCharArray() 快?这里有编译器优化吗? (我使用的是 Java 1.8.0_20)

第二个问题是:
为什么 toCharArray()arraycopy() 快?我从这里复制了 arraycopy():String.toCharArray()

public class MyClass {

private static char[] SRC = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' };

public static void main(String[] args) {
long start = 0;
int init = 0, toCharArray = 0, arraycopy = 0;
for (int j = 0; j < 5; j++) {
start = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++)
init();
init += (System.currentTimeMillis() - start);

start = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++)
toCharArray();
toCharArray += (System.currentTimeMillis() - start);

start = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++)
arraycopy();
arraycopy += (System.currentTimeMillis() - start);
}
System.out.println("init: " + init / 5.0);
System.out.println("toCharArray: " + toCharArray / 5.0);
System.out.println("arraycopy: " + arraycopy / 5.0);
}

private static void init() {
char[] c = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' };
doSomething(c);
}

private static void toCharArray() {
char[] c = "abcdefg".toCharArray();
doSomething(c);
}

private static void arraycopy() {
char[] c = new char[SRC.length];
System.arraycopy(SRC, 0, c, 0, SRC.length);
doSomething(c);
}

private static void doSomething(char[] c) {
for (int i = 0; i < c.length; i++)
c[i] = ' ';
}

}

编辑

卡尺结果:

init:        min=11.90, 1st qu.=12.27, median=12.48, mean=12.44, 3rd qu.=12.54, max=13.16
toCharArray: min=13.10, 1st qu.=13.21, median=13.39, mean=13.49, 3rd qu.=13.78, max=14.27
arraycopy: min=15.42, 1st qu.=15.49, median=15.51, mean=15.51, 3rd qu.=15.55, max=15.58

最佳答案

对于 "abcdefg".toCharArray()String.toCharArray()source code

public char[] toCharArray() {
char result[] = new char[count];
getChars(0, count, result, 0);
return result;
}

getChars calls System.arraycopy 所以它的性能与你的 arraycopy() 应该是一样的。但是,String 的 getChars 从其内部的 char[] 字段复制,该字段被声明为 final

private final char value[];

你的 arraycopy()SRC 复制,这是非最终的

private static char[] SRC = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' };

这只是一个猜测,但尝试使 SRC 最终化,看看会发生什么。

关于java - 数组初始化 - 性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25943373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com