Những gì bạn đang nói về là chuỗi sự phụ thuộc suốt đời, có một điều phụ thuộc vào cái khác có thể được sửa đổi ngoài tầm kiểm soát của nó.
Nếu bạn có một chức năng idempotent từ a
, b
-c
ở đâu, nếu a
và b
đều giống nhau sau đó c
là như nhau nhưng chi phí kiểm tra b
là cao, sau đó bạn có:
- chấp nhận rằng đôi khi bạn hoạt động với thông tin lỗi thời và không phải lúc nào cũng kiểm tra
b
- làm tốt nhất cấp của bạn để kiểm tra
b
nhanh nhất có thể
Bạn không thể có bánh của bạn và ăn nó ...
Nếu bạn có thể lớp một bộ nhớ cache bổ sung dựa trên a
trên đầu thì đây ảnh hưởng đến vấn đề ban đầu không một chút. Nếu bạn chọn 1 thì bạn có bất kỳ sự tự do nào mà bạn đã cho bản thân và do đó có thể nhớ nhiều hơn nhưng phải nhớ xem xét tính hợp lệ của giá trị được lưu trong bộ nhớ cache của b
. Nếu bạn chọn 2, bạn vẫn phải kiểm tra b
mỗi lần nhưng có thể quay lại bộ nhớ cache cho a
nếu b
kiểm tra.
Nếu bạn lưu trữ lớp, bạn phải xem xét liệu bạn có vi phạm 'quy tắc' của hệ thống do hành vi kết hợp hay không.
Nếu bạn biết rằng a
luôn luôn có giá trị pháp lý nếu b
không thì bạn có thể sắp xếp bộ nhớ cache của bạn như vậy (giả):
private map<b,map<a,c>> cache //
private func realFunction // (a,b) -> c
get(a, b)
{
c result;
map<a,c> endCache;
if (cache[b] expired or not present)
{
remove all b -> * entries in cache;
endCache = new map<a,c>();
add to cache b -> endCache;
}
else
{
endCache = cache[b];
}
if (endCache[a] not present) // important line
{
result = realFunction(a,b);
endCache[a] = result;
}
else
{
result = endCache[a];
}
return result;
}
lớp Rõ ràng liên tiếp (nói x
) là tầm thường chừng nào, ở từng giai đoạn tính hợp lệ của đầu vào mới được thêm vào khớp với mối quan hệ a
: b
cho x
: b
và x
: a
.
Tuy nhiên, bạn hoàn toàn có thể nhận được ba yếu tố đầu vào có giá trị hoàn toàn độc lập (hoặc là theo chu kỳ), vì vậy không thể phân lớp được. Điều này có nghĩa dòng đánh dấu quan trọng // sẽ phải thay đổi để
if (endCache [a] hết hạn hoặc không có mặt)
Tôi tin rằng anh ấy đang làm gì đó với việc viết X Windows – Greg
Tôi nghĩ rằng tiêu đề sẽ tốt hơn là "Cache Invalidation - Có giải pháp chung không?" vì nó đề cập đến một lớp cụ thể của vấn đề bộ nhớ đệm. – RBarryYoung
Không, anh ta không biết nhiều về khoa học máy tính. Tôi chắc chắn rằng sự tham gia của anh ấy trong việc tạo OpenGL, X11 và SSLv3 khiến anh ấy quá bận rộn để thực sự nghiên cứu nó nhiều. :-) –