今天我遇到了这个问题,我无法弄清为什么当Groovy数组变大时,它不能比Map更好地扩展。
在我的示例中,我创建了一个Map(LinkedHashMap)和一个字符串数组(String[])。然后,我从0迭代到10 ^ 7将i插入到Map或Array中。我执行了10次以确保异常值不会破坏结果。
int max = 10**7
int numTests = 10
long totalTimeMap = 0
long totalTimeArray = 0
numTests.times{
long start = System.currentTimeMillis()
Map m = [:]
max.times {
m[it] = "${it}"
}
long end = System.currentTimeMillis()
totalTimeMap += (end-start)
}
numTests.times {
long start = System.currentTimeMillis()
String[] s = new String[max]
max.times{
s[it] = "${it}"
}
long end = System.currentTimeMillis()
totalTimeArray += (end-start)
}
println "Map: ${totalTimeMap}"
println "Array: ${totalTimeArray}"
输出结果出乎意料,因为Map的性能优于Array:
Map: 49361
Array: 101123
我在Java中做了同样的实验:
public static void main(String[] args) {
int max = 10000000;
int numTests = 10;
long totalTimeMap = 0;
long totalTimeArray = 0;
for(int i=0; i<numTests; i++){
long start = System.currentTimeMillis();
Map m = new LinkedHashMap();
for(int j=0; j<max; j++){
m.put(j, "" + j);
}
long end = System.currentTimeMillis();
totalTimeMap += (end-start);
}
for(int i=0; i<numTests; i++){
long start = System.currentTimeMillis();
String[] s = new String[max];
for(int j=0; j<max; j++){
s[j] = "" + j;
}
long end = System.currentTimeMillis();
totalTimeArray += (end-start);
}
System.out.println("Map: " + totalTimeMap);
System.out.println("Array: " + totalTimeArray);
}
并且预期的输出结果为(数组比Map更快):
Map: 34564
Array: 12822
我的问题是:为什么在使用Groovy时,Map比Array更快?
[]
通常创建一个列表,即ArrayList
,这将具有调整大小的惩罚。 - Dave Newton