2014-04-16 68 views
0

我最近正在研究一些JavaScript的設計模式和跨記憶化來了,而它看起來像一個很好的解決方案,以避免值我能看到的東西錯了,重新計算。比方說這個簡單的代碼,記憶化在Javascript

function square(num) 
{ 
    var result; 
    if(!square.cache[num]){ 
    console.log("calculating a fresh value..."); 
    result = num*num; 
    square.cache[num] = result; 
    } 
    return square.cache[num]; 
} 
square.cache={} 

調用console.log(square(20)) //打印出「計算一個新鮮參數...」,然後計算400,結果

我真正的問題是什麼情況時,在後續計算之後,高速緩存增長得如此之大,以至於需要更多時間從高速緩存中檢索結果,而不是計算新值。有沒有解決方案?

+1

解決辦法是不使用記憶化。出於某種原因,使用它非常罕見。如果你的緩存可能是非常大的,它仍然是有意義的使用緩存,使用適當的一個(例如LRU緩存) –

+0

這是一個相當簡單的程序,你可以直接做計算。我會說你在這裏濫用記憶化技術;) – thefourtheye

+0

洛爾@thefourtheye,這只是我的好奇心一個簡單的例子。我在我的項目中應用這個更復雜更廣泛的場景。 – shanks

回答

1

我真正的問題是,當高速緩存增長如此之大

在這裏,您將實現一種垃圾收集會發生什麼。可以在Cache Algorithm之後從緩存中移除項目。

因此,例如,下面最近最少使用,你會記錄特定的對象是使用多少次,當它是最後一次訪問,並刪除那些從沒有最近使用的緩存。

編輯

的SoundCloud使用對象存儲和一個非常有趣的閱讀是this article他們如何建立自己的Web應用程序。

+1

感謝gimg1的額外信息。這非常有幫助。 – shanks