Có một cơ hội để làm cho nó nhanh hơn so với bảng tra cứu nếu tính toán số học là vì lý do nào đó nhanh hơn truy cập bộ nhớ. Điều này có thể xảy ra nếu các phép tính được vector hóa (PPC AltiVec hoặc Intel SSE) và/hoặc nếu các phần khác của chương trình cần sử dụng từng bit bộ nhớ cache.
Nếu hệ số mở rộng = 3, chỉ có 7 hướng dẫn là cần thiết:
out = (((in * 0x101 & 0x0F00F) * 0x11 & 0x0C30C3) * 5 & 0x249249) * 7;
Hoặc thay thế khác, với 10 hướng dẫn:
out = (in | in << 8) & 0x0F00F;
out = (out | out << 4) & 0x0C30C3;
out = (out | out << 2) & 0x249249;
out *= 7;
Đối với yếu tố mở rộng khác> = 3:
unsigned mask = 0x0FF;
unsigned out = in;
for (scale = 4; scale != 0; scale /= 2)
{
shift = scale * (N - 1);
mask &= ~(mask << scale);
mask |= mask << (scale * N);
out = out * ((1 << shift) + 1) & mask;
}
out *= (1 << N) - 1;
Hoặc giải pháp thay thế khác, cho các yếu tố mở rộng> = 2:
unsigned mask = 0x0FF;
unsigned out = in;
for (scale = 4; scale != 0; scale /= 2)
{
shift = scale * (N - 1);
mask &= ~(mask << scale);
mask |= mask << (scale * N);
out = (out | out << shift) & mask;
}
out *= (1 << N) - 1;
shift
và mask
giá trị tốt hơn để được tính toán trước khi xử lý luồng bit.
Nguồn
2012-01-28 08:54:21
Nếu bạn chỉ xử lý các giá trị 8 bit, bảng tra cứu gần như chắc chắn sẽ là lựa chọn tốt nhất. Nó sử dụng rất ít không gian. Bạn có thể cung cấp thêm thông tin chi tiết về trường hợp sử dụng của bạn và các hoạt động bạn mong đợi sẽ phổ biến không? – templatetypedef
Đầu vào là luồng bit nối tiếp không đổi. Trong yêu cầu hiện tại, mỗi đoạn dữ liệu đến 8 byte tại một thời điểm, sau đó cần mỗi bit được mở rộng thêm 3 để được gửi đi dưới dạng luồng bit khác. 64bits trong 192bits ra. Một yêu cầu trong tương lai có thể liên quan đến việc thêm các bit "header" trước mỗi giá trị bit 8 mở rộng và tất nhiên là padding vào một ranh giới byte. LUTs được nhanh chóng nhưng cho bao lâu này cần phải chạy, bất kỳ cải thiện hiệu suất tiềm năng sẽ được đánh giá cao. – jivany
Nhiều kiến trúc có hướng dẫn giúp tăng tốc độ tính toán này. Nếu bạn không sợ phá vỡ tính tương thích đa nền tảng, hãy tận dụng những hướng dẫn này gần như chắc chắn là một chiến thắng - và nếu bạn tối ưu hóa điều gì đó về thuật toán "tầm thường" thì chuyển sang tối ưu hóa ở mức thấp là chìa khóa. – Kaganar