분명히 다시 만들 수 있습니다 저장소 개체에 성능까지 향상 (엉덩이 : 그들은 자동으로 때 캐시 꼭대기를 폐기 할 수 있기 때문에). sw 캐시는 associativism 코드를 통해 메모리를 가져와야합니다. 확실히 메모리 할당과 생성자 실행 (대부분 메모리 초기화)이 느립니다.
페이징 메커니즘을 피하기 위해 (정확하게 성능을 높이려면 btw) 수동 사용자 구성을 제외하고 대부분의 OS는 디스크의 메모리를 "캐싱"합니다 ... "페이징", "높은 비용 캐싱 (caching) "은 아무 것도 버려지기 어렵고 메모리 관리 유닛 (Memory Management Unit)이라고하는 하위 처리 단위 인 HW에 의해 수행됩니다 ...
캐싱 코드는 중복되는 동안 프로세스가 느려질 수 있습니다. 나는 당신의 기준을 충족 생각
template<typename K, typename V, typename Map = std::unordered_map<K, typename std::list<K>::iterator>>
class LRUCache
{
size_t maxSize;
Map data;
std::list<K> usageOrder;
std::function<void(std::pair<K, V>)> onEject = [](std::pair<K, V> x){};
void moveToFront(typename std::list<K>::iterator itr)
{
if(itr != usageOrder.begin())
usageOrder.splice(usageOrder.begin(), usageOrder, itr);
}
void trimToSize()
{
while(data.size() > maxSize)
{
auto itr = data.find(usageOrder.back());
onEject(std::pair<K, V>(itr->first, *(itr->second)));
data.erase(usageOrder.back());
usageOrder.erase(--usageOrder.end());
}
}
public:
typedef std::pair<const K, V> value_type;
typedef K key_type;
typedef V mapped_type;
LRUCache(size_t maxEntries) : maxSize(maxEntries)
{
data.reserve(maxEntries);
}
size_t size() const
{
return data.size();
}
void insert(const value_type& v)
{
usageOrder.push_front(v.first);
data.insert(typename Map::value_type(v.first, usageOrder.begin()));
trimToSize();
}
bool contains(const K& k) const
{
return data.count(k) != 0;
}
V& at(const K& k)
{
auto itr = data.at(k);
moveToFront(itr);
return *itr;
}
void setMaxEntries(size_t maxEntries)
{
maxSize = maxEntries;
trimToSize();
}
void touch(const K& k)
{
at(k);
}
template<typename Compute>
V& getOrCompute(const K& k)
{
if(!data.contains(k)) insert(value_type(k, Compute()));
return(at(k));
}
void setOnEject(decltype(onEject) f)
{
onEject = f;
}
};
:
개체의 (다시) 생성이 키 -> 값 조회보다 훨씬 느린 경우 어떻게해야합니까? 모든 생성자가 "주로 메모리 초기화"는 아닙니다. – moswald
나는 왜 downvote를 얻는다 : 나는 응답을 제공하고 있지 않다. 그래서 나는 하나를 얻으려고합니다 : Nowdays MMU는 최근에 사용하지 않은 캐시 된 객체를 포함하는 메모리를 낮은 사용량으로 표시하므로 하드 디스크의 페이지 파일로 전송됩니다. HDD. 따라서 HDD에서 누락 된 캐시 된 객체를 다시 가져 오는 작업, 객체를 다시 작성하기위한 ISO 실행 코드는 아주 까다로운 환경에서만 "올바르게"수행 할 수 있습니다. @ 니콜라스 : 구체적인 상황은 무엇입니까? – jpinto3912
나는 당신이 CPU 캐시와 다른 유형의 데이터 캐시를 혼합한다고 생각하고있다. OP는 CPU가 아닌 데이터 캐시를 찾았습니다. – Dolanor