Tôi có một số mã xử lý hình ảnh lặp qua 2 mảng byte đa chiều (có cùng kích thước). Nó lấy một giá trị từ mảng nguồn, thực hiện một phép tính trên nó và sau đó lưu trữ kết quả trong một mảng khác.Mã này có thể được tối ưu hóa không?
int xSize = ResultImageData.GetLength(0);
int ySize = ResultImageData.GetLength(1);
for (int x = 0; x < xSize; x++)
{
for (int y = 0; y < ySize; y++)
{
ResultImageData[x, y] = (byte)((CurrentImageData[x, y] * AlphaValue) +
(AlphaImageData[x, y] * OneMinusAlphaValue));
}
}
Vòng lặp hiện tại mất ~ 11ms, mà tôi cho là chủ yếu do truy cập giá trị mảng byte khi tính toán khá đơn giản (2 phép nhân và 1 lần thêm).
Tôi có thể làm gì để tăng tốc độ này không? Đó là một phần thời gian quan trọng của chương trình của tôi và mã này được gọi là 80-100 lần mỗi giây, vì vậy bất kỳ tăng tốc độ nào, tuy nhiên nhỏ sẽ tạo ra sự khác biệt. Cũng tại thời điểm xSize = 768 và ySize = 576, nhưng điều này sẽ tăng trong tương lai.
Cập nhật: Cảm ơn Guffa (xem câu trả lời bên dưới), mã sau đây giúp tôi tiết kiệm 4-5ms mỗi vòng lặp. Mặc dù mã số không an toàn.
int size = ResultImageData.Length;
int counter = 0;
unsafe
{
fixed (byte* r = ResultImageData, c = CurrentImageData, a = AlphaImageData)
{
while (size > 0)
{
*(r + counter) = (byte)(*(c + counter) * AlphaValue +
*(a + counter) * OneMinusAlphaValue);
counter++;
size--;
}
}
}
@Andrew Arnott: Mặc dù hoàn toàn chính xác, cũng hoàn toàn vô dụng. ;) – Guffa
Bạn có thể cập nhật thời gian cho mã trong câu trả lời được chấp nhận không? Nó sẽ là thú vị để biết có bao nhiêu sự khác biệt nó làm cho tiết kiệm 3 bổ sung của truy cập mỗi vòng lặp lặp đi lặp lại. –
Nếu bạn nhìn vào phần "CẬP NHẬT" của câu hỏi của tôi thì có. Mã dựa trên câu trả lời được chấp nhận mất 6-7 ms mỗi vòng lặp, so với ~ 11 ms đối với mã ban đầu. Điều này có giúp hay bạn hỏi về một số phiên bản khác của mã? –