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

任何帮助将不胜感激。

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 建议的那样,对于一个简单的练习,您可以将结果放入字典中。键是输入,值是缓存的结果。

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

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

于 2013-06-25T16:30:57.023 回答
1

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

于 2013-06-25T16:22:49.293 回答