이전의 모든 예에서는 메모리를 추가하기 위해 함수가 명시 적으로 수정됩니다. 암기 된 인프라는 기능을 전혀 수정하지 않고도 구현할 수 있습니다. 이것은 암 기능 논리를 암기 된 논리와 별도로 구현할 수 있기 때문에 유용합니다. 이것은 함수를 입력으로 취하고이를 암기에 적용하는 유틸리티 함수를 만들어 수행합니다. 다음 memoize () 함수는 함수 "func"를 입력으로 간주합니다. Memoize ()는 캐시 메커니즘을 "func"주위에 랩핑하는 새로운 함수를 반환합니다. 이 함수는 객체 매개 변수를 처리하지 않습니다. 객체를 처리하기 위해서는 각 매개 변수를 개별적으로 확인하고 필요에 따라 Stringify가 필요한 루프가 필요합니다.
제한
메모리를 실현할 때 다음 사항을 기억해야합니다. 먼저, 오래된 결과를 저장함으로써 암기 함수는 추가 메모리를 소비합니다. Fibonacci 예제에서 추가 메모리 소비는 무제한입니다. 메모리 사용이 문제 인 경우 고정 크기 캐시를 사용해야합니다. 메모리와 관련된 오버 헤드는 또한 매우 빠르게 실행되거나 빈도가 낮은 기능에 부적합 할 수 있습니다.
메모리의 가장 큰 한계는 <code class="language-javascript">var fibonacci = (function() {
var memo = {};
function f(n) {
var value;
if (n in memo) {
value = memo[n];
} else {
if (n === 0 || n === 1)
value = n;
else
value = f(n - 1) + f(n - 2);
memo[n] = value;
}
return value;
}
return f;
})();</code>
참조 투명 함수에 자동으로만 적용될 수 있다는 것입니다. 함수의 출력이 입력에만 의존하고 부작용을 생성하지 않으면 함수는 참조 변환으로 간주됩니다. 이 참조 투명 함수는 프로그램의 의미를 변경하지 않고 반환 값으로 대체 할 수 있습니다. Fibonacci 함수는 전적으로 "n"의 값에 의존하기 때문에 투명합니다. 다음 예에서는 FOO () 함수가 글로벌 변수 "bar"를 사용하기 때문에 투명하지 않습니다. "bar"는 foo () 외부에서 수정 될 수 있기 때문에 각 입력 값에 대해 반환 값이 변경되지 않음을 보장 할 수 없습니다. 이 예에서는 두 개의 호출에 전달 된 매개 변수가 동일하더라도 Foo () 반환 값 2 및 3에 대한 두 호출.
기억해야 할 것들
암기는 이전 기능 호출의 결과를 캐싱하여 성능을 향상시킬 수 있습니다. -
메모리 함수는 입력 매개 변수로 인덱스 된 캐시를 저장합니다. 캐시에 매개 변수가 존재하면 캐시 값이 반환됩니다. 그렇지 않으면 함수를 실행하고 새로 계산 된 값을 캐시에 추가하십시오.
객체 매개 변수는 인덱스로 사용되기 전에 문자열을 연결해야합니다. -
암기는 참조 투명 함수에 자동으로 적용될 수 있습니다.
암기는 자주 호출되지 않거나 빠르게 실행되지 않는 기능에 이상적이지 않을 수 있습니다. -
JavaScript (FAQ)에서 암기에 대한 FAQ
JavaScript에서 메모리를 사용하는 주요 목적은 무엇입니까? -
암기는 자바 스크립트 및 기타 언어로 컴퓨터 프로그램을 최적화하는 데 사용되는 프로그래밍 기술입니다. 이 기술에는 비싼 함수 호출 결과를 저장하고 동일한 입력이 다시 나타날 때 재사용하는 것이 포함됩니다. 이는 불필요한 계산을 피함으로써 프로그램의 성능을 크게 향상시킬 수 있습니다. 동일한 매개 변수로 반복적으로 호출되는 재귀 함수 또는 함수가있는 상황에서 특히 유용합니다.
메모리는 JavaScript에서 어떻게 작동합니까? -
JavaScript에서, 메모리는 기능 호출의 결과를 저장하기 위해 캐시를 만들어 작동합니다. 함수를 호출 할 때 기능은 먼저 주어진 입력 결과가 이미 캐시에 있는지 확인합니다. 그렇다면 함수는 계산을 다시 수행하는 대신 캐시 된 결과를 반환합니다. 결과가 캐시에 있지 않으면 함수는 계산을 수행하고 결과를 캐시에 저장하고 결과를 반환합니다.
JavaScript에서 암기 된 기능의 예를 제공 할 수 있습니까?
물론, 숫자의 계승을 계산하는 간단한 기능의 예를 고려해 봅시다. 메모리가 없으면 기능은 다음과 같습니다
메모리를 사용하여 이전 기능 호출의 결과를 저장 하여이 기능을 최적화 할 수 있습니다.
JavaScript에서 메모리를 사용하는 데 필요한 제한이나 단점이 있습니까?
암기는 JavaScript 프로그램의 성능을 크게 향상시킬 수 있지만 그 제한이없는 것은 아닙니다. 메모리의 주요 단점은 특히 캐시에 많은 데이터를 저장할 때 많은 메모리를 소비 할 수 있다는 것입니다. 제대로 관리하지 않으면 성능 문제로 이어질 수 있습니다. 또한 메모리는 함수가 동일한 매개 변수로 여러 번 호출 될 때만 유효합니다. 함수 입력이 항상 다른 경우 암기는 성능 이점을 제공하지 않습니다.
JavaScript의 모든 유형의 함수에 대해 암기를 사용할 수 있습니까?
암기는 순수한 기능과 함께 사용될 때 가장 효과적입니다. 순수한 함수는 항상 동일한 입력의 동일한 결과를 반환하고 부작용을 일으키지 않는 함수입니다. 기능을 암기하면 외부 상태에 의존하거나 부작용이있는 경우 예상치 못한 결과로 이어질 수 있습니다. 따라서 JavaScript의 모든 유형의 기능에 대해 기술적으로 암기를 사용할 수는 있지만 순수한 기능에 가장 적합합니다.
JavaScript의 여러 매개 변수로 기능을 암기하는 방법은 무엇입니까?
여러 매개 변수가있는 함수에 대한 메모리 구현은 약간 복잡 할 수 있지만 이는 확실히 가능합니다. 한 가지 방법은 인수를 캐시의 키로 사용할 수있는 문자열로 변환하는 것입니다. 예는 다음과 같습니다.
JavaScript에서 암기하는 데 도움이되는 라이브러리 나 도구가 있습니까?
예, JavaScript에서 암기하는 데 도움이되는 라이브러리와 도구가 있습니다. 예를 들어, 인기있는 JavaScript 유틸리티 라이브러리 Lodash는 기능을 쉽게 암기 할 수있는
기능을 제공합니다. 마찬가지로 Ramda 라이브러리는 사용자 정의 캐시 키 함수를 지정할 수있는 <code class="language-javascript">function fibonacci(n) {
if (n === 0 || n === 1)
return n;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}</code>
기능을 제공합니다.
메모리 기능에서 캐시를 지우는 방법은 무엇입니까?
캐시 객체를 단순히 재설정하여 메모리 함수의 캐시를 지울 수 있습니다. 예는 다음과 같습니다.
메모리는 React와 같은 JavaScript 프레임 워크에서 사용할 수 있습니까? _.memoize
예, 메모리는 React와 같은 JavaScript 프레임 워크에서 매우 유용합니다. 예를 들어, React는 구성 요소를 암기하는 데 사용할 수있는 R.memoizeWith
함수를 제공합니다. 이는 부품의 불필요하게 다시 렌더링을 방지하여 성능을 향상시키는 데 도움이 될 수 있습니다.
JavaScript의 메모리는 다른 최적화 기술과 비교하여 어떻게됩니까?
암기는 강력한 최적화 기술이지만 항상 최상의 솔루션은 아닙니다. 경우에 따라 Dejitter 및 스로틀링과 같은 다른 최적화 기술이 더 적합 할 수 있습니다. 핵심은 프로그램의 특정 요구와 제약을 이해하고 올바른 최적화 기술을 선택하는 것입니다.