1

これが私が抱えている問題のコードです。とてもシンプルですが、私はまだ学んでいます。結果をキャッシュしたいので、関数は現在よりも数秒速く戻ります。現時点では、2 のはずが 4 で呼び出し元に返されています。

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

どんな助けでも大歓迎です。

4

3 に答える 3

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
于 2013-06-25T16:29:36.643 に答える
2

簡単な演習として、James Culshaw が提案したように、結果を Dictionary に入れることができます。キーは入力、値はキャッシュされた結果です。

これが本格的な作業用である場合は、使用を検討したいと思いSystem.Runtime.Caching.MemoryCacheます。ディクショナリの問題は、項目がディクショナリから決して出てこないことです (入力ドメインが制限されている場合はそれほど悪くはありませんが、ある意味ではリークします)。本番対応のキャッシュは、メモリの負荷を処理したり、アイテムの有効期限をサポートしたりします (たとえば、結果を 10 分間キャッシュします)。これらの要件は、によって処理されMemoryCacheます。

副作用がなく、入力のみに依存する関数の結果をキャッシュすることは、正式にはメモ化と呼ばれます。プログラミングの演習を拡張するには、通常の (遅い) 関数をラップできる一般的なメモ化関数を作成することをお勧めします。例FastCompute = Memoize(SlowCompute)

于 2013-06-25T16:30:57.023 に答える