想要制作缓存

时间:2013-06-25 16:19:43

标签: vb.net caching memoization

这是我遇到的问题的代码。这很简单,但我还在学习。 我想缓存结果,因此函数返回比当前快几秒。当它应该是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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

对于一个简单的练习,您可以将结果放入字典中,正如James Culshaw所说。关键是输入,值是缓存的结果。

如果这是为了认真工作,我宁愿考虑使用System.Runtime.Caching.MemoryCache。字典的问题在于项目永远不会从它中消失(在某种程度上它们会泄漏,如果输入域有界限,它就不会那么糟糕)。生产就绪缓存将处理内存压力或支持项目到期(例如,将结果缓存10分钟)。这些要求由MemoryCache处理。

缓存没有副作用且仅依赖于其输入的函数的结果正式称为Memoization。编程练习的一个很好的扩展是编写一个通用的memoization函数,它可以包装任何常规(慢)函数。例如。 FastCompute = Memoize(SlowCompute)

答案 2 :(得分:1)

简单的选项是使用Dictionary对象,然后检查是否已为传入getmyresult的参数设置了密钥。如果有,则传递存储在字典中的值,如果不处理结果,则将其添加到字典中,然后返回结果。第二次调用将近乎即时,因为它已经缓存在字典中。