Я пришел в эту проблему сегодня, и я не мог понять, почему массивный массив не масштабируется лучше, чем Map, когда он становится больше.Почему карта Groovy масштабируется лучше, чем Array?
В моем примере я создаю карту (LinkedHashMap) и массив String (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: 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);
}
и выход ожидался (Array быстрее, чем Карта):
Map: 34564
Array: 12822
Мой вопрос: почему Карта работает быстрее, чем Массив при использовании Groovy?
И это согласовано между несколькими казнями? Просто быть педантичным. – christopher
да есть. Вы можете установить max до 10^6 или 10^5, чтобы пример работал быстрее. – lfrodrigues
Также убедитесь, что это массив; Groovy '[]' обычно создает список, 'ArrayList', который будет изменять размер штрафов. –