这是我遇到的问题的代码。这很简单,但我还在学习。 我想缓存结果,因此函数返回比当前快几秒。当它应该是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
非常感谢任何帮助。
答案 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的参数设置了密钥。如果有,则传递存储在字典中的值,如果不处理结果,则将其添加到字典中,然后返回结果。第二次调用将近乎即时,因为它已经缓存在字典中。