2013-06-17 2 views
0

은 우리가 이러한 종류의 코드를 보자 그래서 그것은 단지 한 번 계산 될 것인가? 아니면 두 번 계산 될까요? 구글에게 대답을하려고했지만 행운이 없었다.캐싱 기능 결과

그리고 클로저를 캐싱하는 것은 어떨까요?

+0

확실한 답변이 없지만 2 개의 호출간에 변경 될 수 있으므로 결과를 캐시해서는 안됩니다. 또한 컴파일러는 컴파일러가 아니라 런타임에 함수의 실행이 완료되는 것을 보는 방식으로 컴파일러와 관련이 있다고 생각하지 않습니다. –

답변

2

함수가 두 번 실행됩니다. 컴파일러/런타임이 함수의 결과가 두 번째와 동일 할 것인지를 알 수있는 방법은 없습니다. 함수의 원하는 기능인 경우 값을 캐시해야합니다.

이 경우 함수의 결과를 변수로 저장하여 함수의 결과를 캐시에 저장하는 대신 유효성을 검사 한 다음 사용하는 것이 좋습니다.

람다, 클로저 등을 사용해도 위의 내용은 변경되지 않습니다.

+0

>이 경우에는 변수로서의 기능 .. 예, 분명하지만 더 많은 함수 스타일 코드를 사용하는 것을 선호합니다. 그래서 슬프게도 캐시되지 않을 것입니다. ( –

+0

@ gleb.kudr 언어/런타임은 결과가 두 번째로 동일하다는 것을 어떻게 알 것인가? 그렇지 않습니다. 함수의 많은 부분이 동일하지 않습니다. 반복적으로 호출되며, 모든 함수의 결과를 모두 캐시하기 위해 많은 메모리가 필요합니다. 아마도 프로그래머는 모든 메모리를 사용하기를 원하지 않을 것입니다. 만약 그들이 * 할 * 경우 명시 적으로 시간이 걸릴 수 있습니다 생성하기에 충분히 비싼 값을 캐싱 할 수 있습니다 (특히 수행하기가 어렵지는 않으며 소수의 코드 만 사용합니다). – Servy

0

C# 컴파일러는 여기서 결과를 캐싱하지 않습니다. 나는 JIT가 일반적으로 기대하지 않을 것이다. 물론 지역 변수를 사용하는 것만으로도 쉽게 현지에서 직접 할 수 있습니다. 또한 클로저 자체에 적용 할 약간의 메모 메서드를 작성하여 결과가 더 광범위하게 캐시되도록 할 수 있지만 사용 방법에주의해야합니다.

C# 컴파일러 은 특정 상황에서 람다 식 자체를 캐시하지만 구현 세부 사항입니다. 특히 어떤 변수 (예 : this)도 포착하지 않은 람다 식은 Microsoft 구현에 의해 캐시됩니다.

0

결과가 캐시되지 않습니다. 위임자에게 전화 할 때마다 계산이 수행됩니다.