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

Любая помощь будет принята с благодарностью.

+2

Что вы пробовали? Вы показали нам, что вы пытаетесь сделать, но не проблема. – Chris

+0

@Chris Я пытался изо всех сил пытаться сделать что-нибудь, что мне было предложено создать его со словарем, но я не мог сделать ни головы, ни хвост, как это сделать. – TroubledElf

ответ

5

Да, это называется memo-ization.

Вы можете прочитать на нем здесь: 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

Для простого упражнения вы можете поместить результаты в словарь, как Джеймс - предложил Кулша. Ключ - это вход, значение - это кешированный результат.

Если бы это было для серьезной работы, я бы предпочел использовать System.Runtime.Caching.MemoryCache. Проблема со словарем заключается в том, что элементы никогда не выходят из него (в какой-то мере они протекают, хотя если входной домен ограничен, это не так уж плохо). Готовый кэш кеш будет обрабатывать давление памяти или время ожидания элементов поддержки (например, кешировать результат в течение 10 минут). Эти требования обрабатываются MemoryCache.

Кэширование результата функции, которая не имеет побочного эффекта и зависит только от ее входов, формально называется Memoization. Хорошим дополнением к вашему упражнению по программированию было бы написать общую функцию memoization, которая может обернуть любую регулярную (медленную) функцию. Например. FastCompute = Memoize(SlowCompute).

+1

Хорошие предложения за пределами основ. Благодаря! – RutledgePaulV

+1

@jods спасибо человеку, я буду использовать это также в отдельной части моей курсовой работы, так как это покажет основной ответ и профессиональный ответ, спасибо вам, сэр. !!! – TroubledElf