2011-06-24 49 views
59

Tôi muốn biết sự khác biệt thực sự giữa bộ nhớ đệm và ghi nhớ là gì. Như tôi thấy, cả hai đều liên quan đến việc tránh các cuộc gọi hàm lặp lại để lấy dữ liệu bằng cách lưu trữ nó.Sự khác biệt giữa Caching và Memoization là gì?

Sự khác nhau giữa hai loại là gì?

+0

Tôi tự hỏi nếu bạn có thể nói "ghi nhớ là để lưu vào bộ nhớ đệm" là "mảng là mảng thưa thớt". Nói cách khác, bạn chỉ lưu trữ những thứ "theo yêu cầu" thay vì liệt kê mọi kết hợp đầu vào có thể có. –

Trả lời

60

Ghi nhớ là một dạng bộ nhớ đệm cụ thể liên quan đến việc lưu vào bộ nhớ đệm giá trị trả về của hàm dựa trên các tham số của hàm.

Lưu vào bộ nhớ cache là thuật ngữ tổng quát hơn; ví dụ, bộ nhớ đệm HTTP là bộ nhớ đệm nhưng không ghi nhớ.

Wikipedia says:

Mặc dù có liên quan đến bộ nhớ đệm, memoization đề cập đến một trường hợp cụ thể của tối ưu hóa này, phân biệt nó từ hình thức của bộ nhớ đệm như đệm hoặc trang thay thế.

+2

nhưng bạn luôn có thể surrond phần nơi bộ nhớ cache được sử dụng với một chức năng và christened nó 'memoization'. mặc dù sự khác biệt là bạn đang kiểm soát chính sách bộ nhớ đệm trong chức năng của bạn, trong khi ghi nhớ là thứ tự cao hơn và xảy ra bên ngoài hàm tôi đoán. – nicolas

5

Tôi nghĩ thuật ngữ bộ đệm thường được sử dụng khi bạn lưu trữ kết quả hoạt động IO hoặc về cơ bản mọi dữ liệu đến từ bên ngoài (tệp, mạng, truy vấn db). Ghi nhớ thuật ngữ thường áp dụng cho việc lưu trữ các kết quả tính toán của riêng bạn, ví dụ trong bối cảnh lập trình động.

23

Như tôi đã thấy chúng được sử dụng, "ghi nhớ" là "bộ nhớ đệm kết quả của một hàm xác định" có thể được sao chép bất cứ lúc nào với cùng chức năng và đầu vào.

"Caching" bao gồm về cơ bản bất kỳ chiến lược đệm đầu ra nào, cho dù giá trị nguồn có thể tái sản xuất tại một thời điểm nhất định hay không. Trong thực tế, bộ nhớ đệm cũng được sử dụng để tham khảo nhập các chiến lược đệm, chẳng hạn như ghi bộ nhớ cache trên đĩa hoặc bộ nhớ. Vì vậy, nó là một thuật ngữ tổng quát hơn nhiều.

+0

Bạn có chắc chắn rằng hàm phải được xác định? – Gherman

+1

@German, vâng, ghi nhớ phụ thuộc vào quyết định. Ví dụ cổ điển là một thuật toán đệ quy, chẳng hạn như chuỗi Fibonacci hoặc giai thừa. Thay vì tính toán lại tất cả các cách xuống trường hợp cơ sở, một hàm ghi nhớ sẽ ngắn mạch bằng cách sử dụng lại các kết quả trước đó cho các giá trị mà nó đã được tính toán. Điều này rõ ràng phụ thuộc vào cùng một đầu vào luôn luôn cho ra cùng một đầu ra, đó là định nghĩa về xác định. Caching, mặt khác, thường được sử dụng cho các quy trình không xác định (ví dụ: ngẫu nhiên hoặc dấu thời gian), với sự hiểu biết rằng kết quả có thể không khớp với giá trị "được làm mới". – harpo

0

Ghi nhớ là một hình thức đặc biệt của bộ nhớ đệm kết quả của một hàm xác định. Điều này có nghĩa rằng bộ nhớ đệm kết quả bên ngoài chức năng không phải là ghi nhớ vì chức năng sẽ phải thay đổi bộ nhớ cache khi tính toán một kết quả mới (chưa có trong bộ đệm) để nó sẽ không còn là một hàm thuần túy nữa. Việc ghi nhớ thường ngụ ý chuyển bộ nhớ cache như một đối số bổ sung (trong một hàm trợ giúp). Việc ghi nhớ sẽ tối ưu hóa các chức năng cần tính toán các giá trị nhiều lần cho một lần truy cập. Caching sẽ tối ưu hóa các hàm được gọi nhiều lần với cùng các tham số. Nói cách khác, bản ghi nhớ sẽ tối ưu hóa quyền truy cập đầu tiên cho dù bộ nhớ đệm sẽ chỉ tối ưu hóa truy cập lặp lại.

Các vấn đề liên quan