更新: 嘿傢伙感謝回覆。昨晚和今晚我嘗試了幾種不同的方法,並提出了一個類似於下面Jeff提出的方案(我甚至已經完成了他在更新中提出的建議,並將我自己的簡單LL實現放在一起以獲得更多收益)。這裏是代碼,在這一點上,它看起來不再特別乾淨,但我已經經歷了無數次改變任何可以提高性能的東西。如何讓我的簡單.NET LRU緩存更快?
public class NewLRU2<K, V> where V : class
{
int m_iMaxItems;
Dictionary<K, LRUNode<K, V>> m_oMainDict;
private LRUNode<K,V> m_oHead;
private LRUNode<K,V> m_oTail;
private LRUNode<K,V> m_oCurrent;
public NewLRU2(int iSize)
{
m_iMaxItems = iSize;
m_oMainDict = new Dictionary<K, LRUNode<K,V>>();
m_oHead = null;
m_oTail = null;
}
public V this[K key]
{
get
{
m_oCurrent = m_oMainDict[key];
if (m_oCurrent == m_oHead)
{
//do nothing
}
else if (m_oCurrent == m_oTail)
{
m_oTail = m_oCurrent.Next;
m_oTail.Prev = null;
m_oHead.Next = m_oCurrent;
m_oCurrent.Prev = m_oHead;
m_oCurrent.Next = null;
m_oHead = m_oCurrent;
}
else
{
m_oCurrent.Prev.Next = m_oCurrent.Next;
m_oCurrent.Next.Prev = m_oCurrent.Prev;
m_oHead.Next = m_oCurrent;
m_oCurrent.Prev = m_oHead;
m_oCurrent.Next = null;
m_oHead = m_oCurrent;
}
return m_oCurrent.Value;
}
}
public void Add(K key, V value)
{
if (m_oMainDict.Count >= m_iMaxItems)
{
//remove old
m_oMainDict.Remove(m_oTail.Key);
//reuse old
LRUNode<K, V> oNewNode = m_oTail;
oNewNode.Key = key;
oNewNode.Value = value;
m_oTail = m_oTail.Next;
m_oTail.Prev = null;
//add new
m_oHead.Next = oNewNode;
oNewNode.Prev = m_oHead;
oNewNode.Next = null;
m_oHead = oNewNode;
m_oMainDict.Add(key, oNewNode);
}
else
{
LRUNode<K, V> oNewNode = new LRUNode<K, V>(key, value);
if (m_oHead == null)
{
m_oHead = oNewNode;
m_oTail = oNewNode;
}
else
{
m_oHead.Next = oNewNode;
oNewNode.Prev = m_oHead;
m_oHead = oNewNode;
}
m_oMainDict.Add(key, oNewNode);
}
}
public bool Contains(K key)
{
return m_oMainDict.ContainsKey(key);
}
}
internal class LRUNode<K,V>
{
public LRUNode(K key, V val)
{
Key = key;
Value = val;
}
public K Key;
public V Value;
public LRUNode<K, V> Next;
public LRUNode<K, V> Prev;
}
有看起來/感覺靠不住的幾個部分 - 喜歡做的加載時重用舊節點 - 但我能得到在porformance有明顯提升了出來。我對它從節點上的實際屬性切換到公共變量所帶來的差異也有些驚訝,但我想這就是它與這些東西的關係。在這一點上面的代碼幾乎完全受到字典操作的性能限制,所以我不確定我會在混合它的時候得到更多的東西。我會繼續考慮並研究一些答案。
說明原帖: 大家好。 所以我寫了一個簡單的輕量級LRU實現用於壓縮庫(我使用它在輸入中找到匹配的字節串,基於散列,LZW風格),並且我正在尋找使其更快。
相關:http://stackoverflow.com/questions/581119/object-cache-for-c – 2009-03-06 03:08:23
大衛,你能告訴我們你將如何使用緩存嗎?訪問模式是什麼樣子的?關於你多久添加一次?你多久看一次?你多久做一次「包含」? – 2009-03-06 17:08:04