Quy tắc quan trọng nhất là tất cả lý thuyết cho đến khi bạn lập hồ sơ. Tôi không giữ với những người nhấn mạnh rằng hồ sơ là tất cả mọi thứ (không có lý thuyết nào đó bạn không tốt hơn là một người trồng hàng hóa đặt dừa trên tai và đợi máy bay đến) nhưng lý thuyết của bạn luôn có thể sai hoặc không đầy đủ, hồ sơ là rất quan trọng.
Nói chung, chúng tôi muốn các nội quét là theo chiều ngang (về mảng, chứ không phải là hình ảnh, mặc dù đối với hầu hết các định dạng đó là như nhau). Lý do được rằng với một mảng như:
00 01 02 03 04 05 06 07 08 09
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
Nó sẽ được đặt ra như:
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
Bạn muốn trở thành quét cùng khối tiếp giáp có thể được nạp vào bộ nhớ đệm CPU và sau đó sử dụng hoàn toàn, thay vì quét từ khối để chặn và cần phải thường xuyên thay đổi nội dung bộ nhớ cache CPU.
Điều này thậm chí còn quan trọng hơn nếu bạn cố gắng song song thuật toán. Bạn muốn mỗi luồng xử lý các khối liên tiếp của bộ nhớ của nó theo cả đầu vào và đầu ra đi, thay vì không chỉ theo cách mã đơn luồng làm việc với tần suất truy cập bộ nhớ cache kém mà còn khiến bộ đệm của nhau bị bẩn và cần làm mới. Điều này có thể là sự khác biệt giữa song song dẫn đến tăng tốc và song song thực sự làm chậm những thứ xuống.
Một điều khác là sự khác biệt giữa mảng 2 chiều byte[,]
thay vì mảng mảng byte[][]
, nhận xét của bạn trong câu hỏi "mảng [y] [x]" khiến tôi tự hỏi liệu có lẽ bạn đang sử dụng hay không. Với cựu để có được arr [1,2] logic là:
- Kiểm tra Bounds
- vị trí Tính (đơn giản số học nhanh)
- Lấy giá trị.
Với trường hợp sau, logic là:
- Kiểm tra giới hạn
- Lấy mảng thông qua con trỏ.
- Kiểm tra giới hạn
- Lấy giá trị.
Ngoài ra còn có ít bộ nhớ cache-hit-frequence tốt hơn. Sau này có lợi ích khi cấu trúc "lởm chởm" là cần thiết, nhưng đó không phải là trường hợp ở đây. 2D hầu như luôn nhanh hơn mảng mảng.
Những điều tôi không thấy như có khả năng giúp đỡ, nhưng tôi chắc chắn sẽ thử chúng trong tình huống của bạn:
Bạn có thể tìm thấy một sự thúc đẩy từ làm 1d < => 2d logic của bạn. Có mảng đơn chiều, trong đó idx = y * width + x. Nó không nên tạo sự khác biệt đáng kể, nhưng nó đáng để thử.
Tối ưu hóa cố gắng cả hai cuộc gọi đến .Length
và bỏ qua việc kiểm tra không cần thiết, vì vậy bạn có thể tìm kiếm thủ công và chuyển sang số học con trỏ không đạt được bất kỳ điều gì, nhưng trong trường hợp bạn thực sự cần phải giảm thời gian xuống chắc chắn là đáng giá.
Cuối cùng. Bạn đã lược tả tốc độ mã của bạn đang quét mảng và không làm gì cả? Nó có thể là một phần khác của mã là nút cổ chai thực sự, và bạn đang sửa chữa những điều sai trái.
Tôi đã đề cập rằng mảng thực sự là một BitmapData cho gán màu bitmap:/sry ... –
Vì vậy, bạn đã ghim bộ nhớ? – Oded
Bạn đã cố gắng mã hóa từng giải pháp và đo lường phải mất bao lâu? Điều đó sẽ cho bạn câu trả lời chính xác nhất. Nhưng nếu tôi phải đoán, tôi muốn nói rằng các tùy chọn 3 và 4 có thể nhanh hơn một chút so với các tùy chọn 1 và 2. – aroth