Trích:
Nguyên văn bởi bbaacc01
Nhìn duới góc độ mã ASM đi, với dspic
một lệnh ghi hoặc đọc dữ liệu bình thường sẽ thực hiện tốt nhất là 1 chu kì lệnh nếu có tham số là thanh ghi. Cứ kể nó là 3 chu kì lệnh (để bù vào các cái râu ria đi).
Ở trường hợp này (Mình chỉ lấy ví dụ của anh Tuan để giải thích, không có ý gì khác, mong anh Tuan bỏ qua)
Code:
BYTE push(BYTE b) {
if(wrHead>1023) return 0;
fifo[wrHead] = b;
wrHead++;
return 1;
}
Vì số 1023 là một số không thể so sánh trực tiếp đuợc, nên nó phải chuyển vào một thanh ghi nào đó ==> tốn 1 lệnh di chuyển
Thực hiện so sánh 1 lần ==> một lệnh so sánh
Thực hiện lệnh rẽ nhánh, trường hợp code tốt nhất thì vẫn tốn một chu kì lệnh
==> Tốn thêm 3 chu kì lệnh.
Như vậy để thực hiện việc di chuyển 1 dữ liệu chúng ta cần
6 chu kì lệnh, 3 để di chuyển, 3 để kiểm tra
hiệu suất của quá trình này là 3/(3+3) = 50%, từ 100% xuống còn 50% là nhiều rồi
|
Quá trình so sánh bằng cách trừ cần 4 chu kỳ máy vì sau khi trừ phải phục hồi lại giá trị cũ để làm tham số cho đoạn code copy dữ liệu. Thay vì vậy, nếu so sánh với 1024 bằng cách test bit 10 thì chỉ cần 3 chu kỳ máy.
Quá trình copy dữ liệu vào mảng cần 5 chu kỳ máy vì luôn phải tăng wrHead, ngoài ra cần thêm 4 chu kỳ máy của lệnh call và return.
Thực tế nếu code đoạn mã trên bằng asm thì nhìn chung số chu kỳ máy tăng thêm chỉ khoảng 3, từ 9 lên 12.
Nếu chương trình của bạn
chỉ làm mỗi việc push/pop thì hiệu suất công việc của bạn sẽ giảm đi 33%.