암기는 기능의 이전 계산 결과를 캐싱하여 기능의 성능을 향상시키는 프로그래밍 기술입니다. 이것은 종종 동일한 매개 변수를 사용하는 재귀 및 수학적 기능에 특히 유용합니다.
메모리 구현에는 함수별로 입력 매개 변수에 의해 인덱싱 된 캐시를 사용하는 것이 포함됩니다. 캐시에 매개 변수가 존재하면 캐시 값이 반환되며 기능이 실행되고 결과가 캐시에 추가됩니다.
암기가 여러 매개 변수가있는 함수에 암기를 사용하는 경우 다차원 캐시를 사용할 수 있거나 모든 매개 변수를 결합하여 단일 인덱스를 형성 할 수 있습니다. 인덱스로 사용되기 전에 객체 매개 변수를 연결해야합니다.
암기에는 특정한 한계가 있습니다. 메모리 소비를 증가시키고 빠르게 실행하거나 저주파를 호출하는 기능에는 적합하지 않을 수 있습니다. 투명 함수에 대한 참조로만 자동화 될 수 있습니다. 즉, 출력은 입력에만 의존하며 부작용을 생성하지 않습니다.
이 기능은 더 작은 "n"값에 적합합니다. 그러나 "N"이 증가함에 따라 성능이 빠르게 떨어집니다. 두 재귀 호출이 같은 작업을 반복하기 때문입니다. 예를 들어, 50 번째 Fibonacci 번호를 계산하려면 재귀 함수를 40 억 회 이상 (40,730,022,147) 이상 호출해야합니다! 설상가상으로 51 번째 그림을 계산하려면 작업을 거의 두 번 반복해야합니다. 기능이 이전에 계산 한 내용을 기억하면 반복 작업의 문제를 완화 할 수 있습니다.
암기의 기본
암기는 기능의 이전 계산 결과를 캐싱하여 기능의 성능을 향상시키려는 프로그래밍 기술입니다. JavaScript 객체는 연관 배열처럼 행동하기 때문에 캐시 역할을하는 데 이상적입니다. 메모리 함수가 호출 될 때마다 매개 변수는 인덱스 캐시에 사용됩니다. 데이터가 존재하면 전체 기능을 실행하지 않고 반환 할 수 있습니다. 그러나 데이터가 캐시되지 않으면 기능이 실행되고 결과가 캐시에 추가됩니다.
다음 예에서는 원래 Fibonacci 함수가 메모리를 포함하도록 다시 작성됩니다. 이 예에서, 자체 이행 익명 함수는 Fibonacci 함수로 사용되는 내부 함수 f ()를 반환합니다. f ()가 반환되면 폐쇄를 통해 "메모"객체에 계속 액세스 할 수 있으며, 이는 이전 결과를 모두 저장합니다. f ()가 실행될 때마다 먼저 현재 "n"값의 결과가 존재하는지 확인합니다. 존재하면 캐시 값이 반환됩니다. 그렇지 않으면 원래 Fibonacci 코드를 실행하십시오. "메모"는 F () 외부에서 정의되므로 여러 기능 호출에서 값을 유지할 수 있습니다. 원래 재귀 함수는 50 번째 Fibonacci 번호를 계산하기 전에 40 억 회 이상이라고 불렀습니다. 메모리를 구현 함으로써이 숫자는 99로 떨어집니다.
function fibonacci(n) {
if (n === 0 || n === 1)
return n;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
로그인 후 복사
로그인 후 복사
로그인 후 복사
<<> 여러 매개 변수 처리
<🎜 🎜>
이전 예에서는이 함수가 단일 매개 변수를 허용합니다. 이것은 캐싱 구현을 매우 간단하게 만듭니다. 불행히도 대부분의 함수에는 캐시 된 인덱스를 복잡하게하는 여러 매개 변수가 필요합니다. 여러 매개 변수로 함수를 암기하려면 캐시가 다차원이되거나 모든 매개 변수를 결합하여 단일 인덱스를 형성해야합니다. 다차원 적 방법에서 캐시는 단일 객체가 아니라 객체의 계층이됩니다. 그런 다음 각 차원은 단일 매개 변수로 인덱싱됩니다. 다음 예제는 Fibonacci 기능에 대한 다차원 캐시를 구현합니다. 이 예에서는이 함수가 추가 매개 변수 "x"를 수용하고 아무것도하지 않습니다. 함수가 호출 될 때마다 코드는 "x"차원이 존재하는지 확인하고 존재하지 않으면 초기화됩니다. 그 이후로 "x"차원은 "n"값을 캐시하는 데 사용됩니다. 결과적으로 함수는 fibonacci ( "foo", 3) 및 fibonacci ( "bar", 3)가 동일한 결과로 간주되지 않습니다.
다차원 캐시에 대한 대안은 단일 캐시 객체로, 함수의 모든 매개 변수의 조합으로 인덱싱됩니다. 이 방법에서는 매개 변수가 배열로 변환 된 다음 인덱스 캐시에 사용됩니다. 각 함수에는 전달 된 매개 변수를 포함하는 "인수"라는 내장 객체가 있습니다. "인수"는 클래스의 배열 객체라고 불리는 유형의 객체입니다. 배열과 유사하지만 인덱스 캐시에는 사용할 수 없습니다. 따라서 먼저 실제 배열로 변환해야합니다. 배열 슬라이스 () 메소드를 사용하여 수행 할 수 있습니다. 그런 다음 이전에 표시된대로 배열 표현을 사용하여 캐시를 색인화 할 수 있습니다. 다음 예는이를 달성하는 방법을 보여줍니다. 추가 변수 "슬라이스"는 배열 슬라이스 () 메소드에 대한 참조로 정의됩니다. 이 참조를 저장하면 Array.prototype.slice () 오버 헤드의 반복 계산을 피할 수 있습니다. 그런 다음 Call () 메소드를 사용하여 Slice ()를 "인수"에 적용하십시오.
<<> 캐시 객체 매개 변수
<🎜 🎜> 여기에 소개 된 메모리 체계는 객체 매개 변수를 잘 처리하지 못합니다. 객체가 인덱스로 사용되면 먼저 "[개체 개체]"와 같은 문자열 표현으로 변환됩니다. 이로 인해 여러 객체가 동일한 캐시 위치에 잘못 매핑됩니다. 이 동작은 인덱싱 전에 객체 매개 변수를 문자화하여 수정할 수 있습니다. 불행히도, 이것은 메모리 과정도 느려집니다. 다음 예제는 객체를 인수로 취하는 일반적인 메모리 함수를 만듭니다. 객체 매개 변수는 json.stringify ()를 사용하여 캐시 된 인덱스를 생성하여 문을 닫습니다.
<🎜 🎜> <<> 자동 메모리
function fibonacci(n) {
if (n === 0 || n === 1)
return n;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
로그인 후 복사
로그인 후 복사
로그인 후 복사
<🎜 🎜>
이전의 모든 예에서는 메모리를 추가하기 위해 함수가 명시 적으로 수정됩니다. 암기 된 인프라는 기능을 전혀 수정하지 않고도 구현할 수 있습니다. 이것은 암 기능 논리를 암기 된 논리와 별도로 구현할 수 있기 때문에 유용합니다. 이것은 함수를 입력으로 취하고이를 암기에 적용하는 유틸리티 함수를 만들어 수행합니다. 다음 memoize () 함수는 함수 "func"를 입력으로 간주합니다. Memoize ()는 캐시 메커니즘을 "func"주위에 랩핑하는 새로운 함수를 반환합니다. 이 함수는 객체 매개 변수를 처리하지 않습니다. 객체를 처리하기 위해서는 각 매개 변수를 개별적으로 확인하고 필요에 따라 Stringify가 필요한 루프가 필요합니다.
<<> 제한
메모리를 실현할 때 다음 사항을 기억해야합니다. 먼저, 오래된 결과를 저장함으로써 암기 함수는 추가 메모리를 소비합니다. Fibonacci 예제에서 추가 메모리 소비는 무제한입니다. 메모리 사용이 문제 인 경우 고정 크기 캐시를 사용해야합니다. 메모리와 관련된 오버 헤드는 또한 매우 빠르게 실행되거나 빈도가 낮은 기능에 부적합 할 수 있습니다.
메모리의 가장 큰 한계는
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;
})();
로그인 후 복사
참조 투명
함수에 자동으로만 적용될 수 있다는 것입니다. 함수의 출력이 입력에만 의존하고 부작용을 생성하지 않으면 함수는 참조 변환으로 간주됩니다. 이 참조 투명 함수는 프로그램의 의미를 변경하지 않고 반환 값으로 대체 할 수 있습니다. 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 라이브러리는 사용자 정의 캐시 키 함수를 지정할 수있는
function fibonacci(n) {
if (n === 0 || n === 1)
return n;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
로그인 후 복사
로그인 후 복사
로그인 후 복사
기능을 제공합니다.
메모리 기능에서 캐시를 지우는 방법은 무엇입니까?
캐시 객체를 단순히 재설정하여 메모리 함수의 캐시를 지울 수 있습니다. 예는 다음과 같습니다.
메모리는 React와 같은 JavaScript 프레임 워크에서 사용할 수 있습니까? _.memoize
예, 메모리는 React와 같은 JavaScript 프레임 워크에서 매우 유용합니다. 예를 들어, React는 구성 요소를 암기하는 데 사용할 수있는 R.memoizeWith 함수를 제공합니다. 이는 부품의 불필요하게 다시 렌더링을 방지하여 성능을 향상시키는 데 도움이 될 수 있습니다.
JavaScript의 메모리는 다른 최적화 기술과 비교하여 어떻게됩니까?
암기는 강력한 최적화 기술이지만 항상 최상의 솔루션은 아닙니다. 경우에 따라 Dejitter 및 스로틀링과 같은 다른 최적화 기술이 더 적합 할 수 있습니다. 핵심은 프로그램의 특정 요구와 제약을 이해하고 올바른 최적화 기술을 선택하는 것입니다.
위 내용은 JavaScript에서 회고록 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!