Các quy tắc cơ bản thực sự khá đơn giản. Trường hợp trở nên khó khăn là cách họ áp dụng cho mã của bạn.
Bộ đệm hoạt động theo hai nguyên tắc: Địa phương tạm thời và địa phương không gian. Ý tưởng trước đây là nếu gần đây bạn đã sử dụng một đoạn dữ liệu nhất định, có thể bạn sẽ cần lại nó sớm. Điều thứ hai có nghĩa là nếu gần đây bạn đã sử dụng dữ liệu tại địa chỉ X, có thể bạn sẽ sớm cần địa chỉ X + 1.
Bộ nhớ cache cố gắng thực hiện điều này bằng cách ghi nhớ các khối dữ liệu được sử dụng gần đây nhất. Nó hoạt động với các dòng bộ đệm, thường có kích thước 128 byte hoặc hơn, vì vậy ngay cả khi bạn chỉ cần một byte duy nhất, toàn bộ dòng bộ đệm chứa nó sẽ bị kéo vào bộ đệm. Vì vậy, nếu bạn cần byte sau đây, nó sẽ có trong bộ đệm.
Và điều này có nghĩa là bạn sẽ luôn muốn mã của riêng mình khai thác hai dạng địa phương này càng nhiều càng tốt. Đừng nhảy qua bộ nhớ. Làm nhiều việc nhất có thể trên một khu vực nhỏ, sau đó chuyển sang khu vực tiếp theo và làm càng nhiều công việc càng tốt.
Một ví dụ đơn giản là truyền tải mảng 2D mà câu trả lời của 1800 cho thấy. Nếu bạn duyệt qua một hàng tại một thời điểm, bạn sẽ đọc bộ nhớ theo tuần tự. Nếu bạn thực hiện theo cách khôn ngoan, bạn sẽ đọc một mục, sau đó chuyển đến một vị trí hoàn toàn khác (bắt đầu của hàng tiếp theo), đọc một mục và nhảy lại. Và khi cuối cùng bạn quay lại hàng đầu tiên, nó sẽ không còn trong bộ đệm.
Áp dụng tương tự cho mã. Nhảy hoặc các nhánh có nghĩa là sử dụng bộ đệm kém hiệu quả hơn (vì bạn không đọc hướng dẫn tuần tự, mà nhảy đến một địa chỉ khác). Tất nhiên, các câu lệnh if nhỏ có thể sẽ không thay đổi bất cứ điều gì (bạn chỉ bỏ qua một vài byte, vì vậy bạn sẽ vẫn ở trong vùng được lưu trong bộ nhớ cache), nhưng các lệnh gọi hàm thường ngụ ý rằng bạn đang nhảy sang một cách hoàn toàn khác địa chỉ có thể không được lưu trữ. Trừ khi nó được gọi gần đây.
Hướng dẫn sử dụng bộ đệm thường ít hơn một vấn đề. Những gì bạn thường cần phải lo lắng là bộ đệm dữ liệu.
Trong một cấu trúc hoặc lớp, tất cả các thành viên được đặt liên tục, đó là tốt. Trong một mảng, tất cả các mục được đặt liên tục là tốt. Trong các danh sách được liên kết, mỗi nút được phân bổ tại một vị trí hoàn toàn khác nhau, điều này là xấu. Con trỏ nói chung có xu hướng trỏ đến các địa chỉ không liên quan, điều này có thể sẽ dẫn đến việc bỏ lỡ bộ đệm nếu bạn bỏ qua nó.
Và nếu bạn muốn khai thác nhiều lõi, điều đó có thể thực sự thú vị, vì thông thường, chỉ có một CPU có thể có bất kỳ địa chỉ cụ thể nào trong bộ đệm L1 của nó tại một thời điểm. Vì vậy, nếu cả hai lõi liên tục truy cập vào cùng một địa chỉ, điều đó sẽ dẫn đến việc bỏ lỡ bộ nhớ cache liên tục, vì chúng đang chiến đấu với địa chỉ đó.