Những gì bạn đang phải đối mặt là sự đánh đổi bộ nhớ thời gian cổ điển. Các trường bit sẽ nhỏ hơn trong bộ nhớ, nhưng sẽ mất nhiều thời gian hơn để hoạt động. Bạn có thể tính rằng bất kể bộ xử lý nào, các trường bit sẽ chậm hơn.
Bạn sử dụng từ hiệu quả , nhưng từ đó không có nghĩa nhất định nếu không có số liệu cho điều gì là tốt hay xấu. Khi bạn chỉ có 8 k RAM, sử dụng bộ nhớ rất tệ, thời gian có thể rẻ. Nếu bạn có các ràng buộc thời gian thực, thì việc sử dụng thời gian là không tốt và bộ nhớ có thể rẻ. Nói chung, bạn chỉ có thể mua theo cách của bạn ra khỏi sự đánh đổi này. Nói cách khác, khi bạn thấy cả thời gian và bộ nhớ đều tệ, hãy tiêu tiền mặt và sử dụng một con chip lớn hơn. Không có câu trả lời duy nhất cho những gì là tốt hay xấu. Đây là một phần lý do tại sao có rất nhiều sự lựa chọn cho vi điều khiển, mọi người lắp chip vào ứng dụng và ứng dụng cho chip.
Việc điền các bit của trường bit sẽ chậm hơn so với việc điền đầy đủ các byte. Lấy ví dụ
x = 5;
...
asimplestruct.len = x;
// vs
abitfield.len = x;
Trường hợp đơn giản đầu tiên sẽ chỉ:
- tải giá trị của x vào một thanh ghi
- lưu trữ nó vào byte cho len
Thứ hai làm một cái gì đó như:
- tải giá trị hiện tại của abitfield
- tải mặt nạ
- xóa bit cho len
- tải giá trị hiện tại của x
- tải mặt nạ
- xóa các bit không sử dụng của x
- dịch chuyển các bit của x
- hoặc là x với abitfield
- lưu trữ giá trị hiện tại trở lại bộ nhớ
Nếu tất cả các hoạt động của bạn đang đóng gói dữ liệu vào trường bit hoặc giải nén ra khỏi bitfield, bạn sẽ mong đợi việc thực thi chậm hơn. Các trường bit là một loại nén - chúng có giá trị tích tắc.
Nhưng di chuyển xung quanh các trường bit sẽ nhanh hơn vì có ít byte hơn để tải và lưu trữ. Nếu bạn sắp xếp mảng này, số byte nhỏ hơn có thể là một lợi thế. Nếu bạn chuyển chúng qua cổng nối tiếp, kích thước nén của bitfield có thể là người chiến thắng.
Vì vậy, đối với câu hỏi của bạn:
Có một cách tốt để kiểm tra điều này?
Cách tốt nhất để kiểm tra điều này là viết các trường hợp thử nghiệm cho cả hai cách tiếp cận bằng cách sử dụng một mẫu phù hợp chặt chẽ với ứng dụng của bạn. Nó thực sự quan trọng kết hợp các hoạt động bạn thực hiện để quyết định xem sự khác biệt là không đáng kể hay đáng kể.
Khi thực hiện loại thử nghiệm tối ưu hóa này, chắc chắn sử dụng kiểm soát nguồn trên dự án của bạn. Bạn có thể tạo một kho lưu trữ GIT hoặc Mercurial cục bộ chỉ bằng vài cú nhấp chuột. Giữ một chuỗi các điểm kiểm tra cho phép bạn xé mã của mình để khám phá các hiệu ứng của các triển khai khác nhau. Nếu bạn rẽ sai, kho lưu trữ cho phép bạn chỉ cần quay lại điểm tốt cuối cùng và thử một đường dẫn khác.
(Lưu ý bên cạnh: Sự cân bằng bộ nhớ thời gian này cũng tồn tại theo hướng ngược lại. Nếu bạn xem qua các tùy chọn trình biên dịch cho bộ xử lý lớp máy tính để bàn, bạn sẽ tìm thấy một thứ gọi là đóng gói cấu trúc . Tùy chọn này cho phép bạn thêm các byte trống giữa các trường byte đơn sao cho chúng Giữ liên kết ở ranh giới từ hoặc từ kép. Điều này có vẻ điên rồ khi vứt bỏ RAM trên mục đích, nhưng trên các bộ xử lý có thanh ghi và bus rộng 16 hoặc 32 bit, do đó, hoạt động bộ nhớ được căn chỉnh từ hoặc từ có thể nhanh hơn hoạt động khôn ngoan của byte.)