Trong các thử nghiệm của riêng tôi System.arraycopy() để sao chép nhiều mảng kích thước là 10 đến 20 lần nhanh hơn so với đan xen cho vòng:
float[][] foo = mLoadMillionsOfPoints(); // result is a float[1200000][9]
float[][] fooCpy = new float[foo.length][foo[0].length];
long lTime = System.currentTimeMillis();
System.arraycopy(foo, 0, fooCpy, 0, foo.length);
System.out.println("native duration: " + (System.currentTimeMillis() - lTime) + " ms");
lTime = System.currentTimeMillis();
for (int i = 0; i < foo.length; i++)
{
for (int j = 0; j < foo[0].length; j++)
{
fooCpy[i][j] = foo[i][j];
}
}
System.out.println("System.arraycopy() duration: " + (System.currentTimeMillis() - lTime) + " ms");
for (int i = 0; i < foo.length; i++)
{
for (int j = 0; j < foo[0].length; j++)
{
if (fooCpy[i][j] != foo[i][j])
{
System.err.println("ERROR at " + i + ", " + j);
}
}
}
này in:
System.arraycopy() duration: 1 ms
loop duration: 16 ms
@ Peter, vì vậy trong vòng mã nguồn gốc bạn có thể thích ứng với mô hình bộ nhớ Java? (Tôi chưa bao giờ có bất kỳ nguyên nhân nào để làm bất kỳ malarkey nào) –
@ James B, tôi không phải là một chuyên gia về điều này, nhưng trong mã gốc bạn chắc chắn không bị ràng buộc với mô hình bộ nhớ Java hoặc bất cứ điều gì - bạn có thể fiddle với nguyên bit bất kỳ cách nào bạn thích (nguy cơ của riêng bạn, tất nhiên). –
Trên thực tế, chỉ có thể triển khai một số phụ của 'mảng bản sao' bằng cách sử dụng 'memcpy' /' memmove'. Những người khác yêu cầu kiểm tra kiểu thời gian chạy cho mỗi phần tử được sao chép. –