2013-06-25 58 views
1

這是我遇到的問題的代碼。這很簡單,但我仍然在學習。 我想緩存結果,以便函數返回比當前快幾秒。目前它正在返回到4來電時,它應該是2.想要做一個緩存

Sub Main 
    console.writeline(getmyresult(2)) 'takes a while' 
    console.writeline(getmyresult(3)) 'takes a while' 
    console.writeline(getmyresult(2)) 'Should be instant' 
    console.writeline(getMyresult(3)) 'Should be instant' 
End Sub 


function getMyresult(X as interger) as integer 
    dim Y as integer=LongCompute(X) 
    return Y 
end function 


function LongCompute(X as integer) as integer 
    system.threading.thread.sleep(1000) 
    return x^2 
end function 

任何幫助將不勝感激。

+2

你到目前爲止嘗試過什麼?您向我們展示了您正在嘗試做的事情,但不是問題所在。 – Chris

+0

@Chris我一直在努力嘗試做任何事情,我被告知用字典創建它,但我無法做到頭或尾如何做到這一點 – TroubledElf

回答

5

是的,這就是所謂的備忘錄。

你可以在這裏讀了起來: http://en.wikipedia.org/wiki/Memoization

在Visual Basic中簡單的執行如下所示:

Dim dict As New Dictionary(Of Integer, Integer) 

Sub Main() 
    console.writeline(getmyresult(2)) 'takes a while' 
    console.writeline(getmyresult(3)) 'takes a while' 
    console.writeline(getmyresult(2)) 'Should be instant' 
    console.writeline(getMyresult(3)) 'Should be instant' 
End Sub 

Function getMyresult(ByVal X As Integer) As Integer 
    If dict.ContainsKey(X) Then 
     Return dict(X) 
    Else 
     Dim temp = LongCompute(X) 
     dict.Add(X, temp) 
     Return temp 
    End If 
End Function 

Function LongCompute(ByVal X As Integer) As Integer 
    System.Threading.Thread.Sleep(1000) 
    Return x^2 
End Function 
+3

不知道它有一個特定的名字 - 每天學習一些有用的東西; - ) –

+0

@Paul_R謝謝你,我會讀到這個謝謝你的答案,但它將是無用的,如果我不明白再次感謝你 – TroubledElf

1

簡單的選擇是使用Dictionary對象,然後檢查是否已爲傳入getmyresult的參數設置了密鑰。如果有,則傳遞存儲在字典中的值,如果不處理結果,則將其添加到字典中,然後返回結果。第二次調用將會接近瞬間,因爲它已經在字典中緩存了。

2

對於一個簡單的練習,你可以把結果放到一個字典,詹姆斯Culshaw建議。關鍵是輸入,值是緩存的結果。

如果這是爲了認真的工作,我寧願考慮使用System.Runtime.Caching.MemoryCache。字典的問題是,項目永遠不會離開它(以某種方式泄漏,儘管如果輸入域是有界的,它並不是那麼糟糕)。生產就緒緩存將處理內存壓力或支持項目到期(例如,將結果緩存10分鐘)。這些要求由MemoryCache處理。

緩存沒有副作用並且僅依賴於其輸入的函數的結果正式稱爲Memoization。編程練習的一個很好的擴展是編寫一個可以包裝任何常規(慢)函數的通用memoization函數。例如。 FastCompute = Memoize(SlowCompute)

+1

超越基礎知識的好建議。謝謝! – RutledgePaulV

+1

@jods謝謝你,我會在我的課程中單獨使用它,因爲它會顯示基本答案和專業答案,謝謝你,先生。 ! – TroubledElf