Thường thì điều tuyệt vời nhất để làm gì khi tìm kiếm anwers cho các câu hỏi như vậy là để xem làm thế nào lựa chọn được biên dịch vào JVM bytecode:
multi = new int[50][50];
single = new int[2500];
này được dịch sang:
BIPUSH 50
BIPUSH 50
MULTIANEWARRAY int[][] 2
ASTORE 1
SIPUSH 2500
NEWARRAY T_INT
ASTORE 2
Vì vậy, như bạn có thể thấy, JVM đã biết rằng chúng ta đang nói về một mảng đa chiều.
Giữ nó tiếp tục:
for (int i = 0; i < 50; ++i)
for (int j = 0; j < 50; ++j)
{
multi[i][j] = 20;
single[i*50+j] = 20;
}
này được dịch (bỏ qua các chu kỳ) vào:
ALOAD 1: multi
ILOAD 3: i
AALOAD
ILOAD 4: j
BIPUSH 20
IASTORE
ALOAD 2: single
ILOAD 3: i
BIPUSH 50
IMUL
ILOAD 4: j
IADD
BIPUSH 20
IASTORE
Vì vậy, như bạn có thể thấy, mảng đa chiều được xử lý cục bộ trong máy ảo, không có chi phí nào được tạo ra bởi các hướng dẫn vô dụng, trong khi sử dụng một thiết bị duy nhất sử dụng thêm hướng dẫn vì bù đắp được tính bằng tay.
Tôi không nghĩ rằng hiệu suất đó sẽ là vấn đề như vậy.
EDIT:
tôi đã làm một số tiêu chuẩn đơn giản để xem những gì đang xảy ra ở đây. Tôi đã chọn thử các ví dụ khác nhau: đọc tuyến tính, viết tuyến tính, và truy cập ngẫu nhiên. Thời gian được biểu thị bằng millisec (và được tính bằng System.nanoTime()
. Dưới đây là kết quả:
tuyến tính viết
- Kích thước: 100x100 (10000) đa: 5,786591 Độc thân: 6,131748
- Kích thước: 200x200 (40000) đa: 1,216366 Độc thân: 0,782041
- Kích thước: 500x500 (250000) Đa: 7.177029 Độc thân: 3.667017
- Kích thước: 1000x100 0 (1000000) đa: 30,508131 Độc thân: 18,064592
- Kích thước: 2000x2000 (4000000) đa: 185,3548 Độc thân: 155,590313
- Kích thước: 5000x5000 (25.000.000) đa: 955,5299 Độc thân: 923,264417
- Kích : 10000x10000 (100000000) đa: 4084,798753 Độc thân: 4015,448829
tuyến tính đọc
- Kích thước: 100x100 (10000) đa: 5,241338 Độc thân: 5,135957
- Kích thước: 200x200 (40000) đa: 0,080209 Độc thân: 0,044371
- Kích thước: 500x500 (250000) đa: 0,088742 Độc thân : 0.084476
- Kích thước: 1000x1000 (1000000) đa: 0,232095 Độc thân: 0,167671
- Kích thước: 2000x2000 (4000000) đa : 0.481683 Độc thân: 0,33321
- Kích thước: 5000x5000 (25.000.000) đa: 1,222339 Độc thân: 0,828118 Kích thước: 10000x10000 (100000000) đa: 2,496302 Độc thân: 1,650691
ngẫu nhiên đọc
- Kích thước: 100x100 (10000) Đa: 22.317393 Đơn: 8.546134
- Kích thước: 200x200 (40000) đa: 32,287669 Độc thân: 11,022383
- Kích thước: 500x500 (250000) đa: 189,542751 Độc thân: 68,181343
- Kích thước: 1000x1000 (1000000) đa: 1124,78609 Độc thân: 272,235584
- Kích thước: 2000x2000 (4000000) đa: 6814,477101 Độc thân: 1091,998395
- Kích thước: 5000x5000 (25.000.000) đa: 50.051,306239 Độc thân: 7028.422262
Lý do ngẫu nhiên là một chút sai lệch vì nó tạo ra 2 số ngẫu nhiên cho mảng đa chiều trong khi chỉ một cho một chiều (và PNRG có thể tiêu thụ một số CPU).
Hãy nhớ rằng tôi đã cố gắng để JIT hoạt động bằng cách đo điểm chuẩn chỉ sau lần chạy thứ 20 của cùng một vòng lặp. Cho đầy đủ java của tôi VM như sau:
phiên bản java "1.6.0_17" Java (TM) SE Runtime Environment (xây dựng 1.6.0_17-b04) Java HotSpot (TM) 64-Bit Server VM (xây dựng 14,3-b01, chế độ hỗn hợp)
Xem thêm: http://stackoverflow.com/questions/2368761/performance-comparison-of-array-of-arrays-vs-multidimensional-arrays – polygenelubricants