2013-06-25 5 views
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 

모든 도움을 주시면 감사하겠습니다.

+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이라고합니다. 프로그래밍 연습에 대한 좋은 확장은 일반 (느린) 함수를 래핑 할 수있는 일반 메모 작성 함수를 작성하는 것입니다. 예 : FastCompute = Memoize(SlowCompute).

+1

기본을 뛰어 넘는 좋은 제안입니다. 감사! – RutledgePaulV

+1

@ jods 고마워요. 내가 기본 교과서와 전문적인 답변을 보여줄 것이므로 교과서의 별도 부분에서 이것을 사용할 것입니다. 고마워요. !!! – TroubledElf

관련 문제