그래서 저는 메모이제이션이라는 흥미로운 작은 개념을 발견했습니다.
나는 그것에 관한 기사를 읽기 시작했고 아이디어의 꼬리를 잡자마자 중단했습니다.
그런 다음 나는 내가 이해하는 방식으로 내 자신의 간단한 해결책을 찾기로 결정했습니다.
들어본 적이 없다면 메모이제이션은 함수 실행 결과를 저장하는 프로세스이므로 다음에 동일한 인수를 사용하여 해당 함수를 실행할 때 작은(또는 그렇지 않은) 캐시에서 가져올 수 있습니다.
실제로 이는 리소스를 많이 소비하는 기능에 유용할 수 있습니다. 추가 공간을 캐시로 사용하는 데 드는 비용이 발생합니다. 하지만 코드 속도와 코드를 사용하는 사용자의 경험을 향상시킬 수 있습니다.
JS 코드를 조금 사용해 본 결과 다음 솔루션이 나왔습니다.
const memoize = fn => { const cache = {} return (...args) => { const fnKey = `${fn.name}(${args})`; if(!cache[fnKey]) { cache[fnKey] = fn(...args); } return cache[fnKey] }; }
그런 다음 다음과 같이 실행할 수 있습니다.
function _add(x, y) { console.log("function runs", x, y); return x y; } const add = memoize(_add) add(42, 69) add(10, 15) add(10, 15)
이로 인해 함수가 두 번 실행됩니다(#1 및 #2 'add' 호출). 세 번째 '추가' 호출은 #2 호출과 동일하므로 캐시를 사용합니다.
'function runs' 42 69 'function runs' 10 15
'함수 실행' 10 15 이 한 번만 호출되는 것을 볼 수 있습니다. 두 번째로 호출할 때 캐시가 사용되기 때문입니다.
이제 여기서 무슨 일이 일어나고 있는지 빠르게 분석해 보겠습니다.
이 예에서는 폐쇄 메커니즘을 활용하여 캐시를 저장합니다.
const memoize = fn => { const cache = {} return () => { }; }
이를 통해 파티의 최고인 "fn" 인수를 던질 수 있습니다. 이것이 바로 우리가 사용하려는 함수이기 때문입니다. 범위를 낮추고 각 실행을 "듣습니다".
정말 단순하고 순진하게 썼네요. 따라서 우리는 인수가 있는 함수 이름을 캐시의 키로 사용하고 실행 결과를 값으로 사용하겠습니다.
즉, 다음을 실행한다는 의미입니다.
add(2, 2)
결과:
// Our cache { 'add(2, 2)': 4 }
캐시 값.
나는 이것이 정확히 "올바른 방법"으로 수행되어야 하는 방법이 아닐 수도 있다는 것을 알고 있습니다. 하지만 이 연습과 기사의 아이디어는 잘 테스트된 안전하고 극단적인 경우가 없는 솔루션에 관한 것이 아닙니다.
학습과 간단한 구현에 관한 것입니다. 개념에 대해. 그래서 지금은 구체적인 구현 내용에 초점을 맞추고 있지 않습니다.
이제 먼저 함수 호출의 키를 알아냅니다.
const memoize = fn => { const cache = {} return (...args) => { const fnKey = `${fn.name}(${args})`; }; }
함수 실행 결과를 캐시에 저장하는 데 사용합니다.
그런 다음 이 키(fnKey)가 이미 존재하는지 확인합니다. 그렇지 않은 경우 전달된 함수 실행의 결과로 해당 값으로 키를 설정합니다.
결국 우리는 항상 캐시에서 결과를 반환합니다. 따라서 memoize 메소드에 전달된 함수의 실행은 항상 클로저("캐시" 객체)에서 끝납니다.
현재는 이 개체로만 작업합니다.
const memoize = fn => { const cache = {} return (...args) => { const fnKey = `${fn.name}(${args})`; if(!cache[fnKey]) { cache[fnKey] = fn(...args); } return cache[fnKey] }; }
그리고 그게 다입니다.
이제 가서 그것이 어떻게 "제대로" 이루어져야 하는지 살펴보겠습니다. 하지만 이 내용이 흥미롭다면 알려주세요. 이 접근 방식에서 뭔가 불분명하거나 잘못된 경우(귀하의 취향에 따라) 댓글을 삭제하고 이에 대해 이야기해 보세요.
고마워요, 또 봐요!
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3