Tôi đi vào vấn đề này ngày hôm nay và tôi không thể hiểu tại sao mảng groovy không mở rộng quy mô tốt hơn Bản đồ khi nó trở nên lớn hơn.Tại sao Bản đồ của Groovy lại tốt hơn Array?
Trong ví dụ của tôi, tôi tạo Bản đồ (LinkedHashMap) và một mảng Chuỗi (Chuỗi []). Sau đó, tôi lặp lại từ 0 đến 10^7 chèn i vào Bản đồ hoặc Mảng. Tôi làm điều đó 10 lần để chắc chắn rằng các ngoại lệ không làm hỏng kết quả.
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}"
Kết quả thật bất ngờ kể từ khi Map đã có một hiệu suất tốt hơn sau đó Array:
Map: 49361
Array: 101123
tôi đã thực hiện thí nghiệm tương tự trong 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);
}
và đầu ra đã được dự kiến (Mảng nhanh hơn Bản đồ):
Map: 34564
Array: 12822
Câu hỏi của tôi là: tại sao Bản đồ nhanh hơn Mảng khi sử dụng Groovy?
Và điều này nhất quán trong nhiều lần thực thi? Chỉ là phàm. – christopher
vâng. Bạn có thể đặt tối đa 10^6 hoặc 10^5 để ví dụ chạy nhanh hơn. – lfrodrigues
Ngoài ra hãy chắc chắn rằng nó thực sự là một mảng; Groovy '[]' thường tạo ra một danh sách, một 'ArrayList', nó sẽ thay đổi kích thước các hình phạt. –