기억을 통해 자바스크립트 프로그램을 최적화하세요.

몇 달 전, 내가 알고리즘을 배우기 시작했을 때, 나는 막 귀속을 배웠고, 내가 절지의 무사처럼 느껴졌다.뭐 공부 해요?만약 네가 망치 하나밖에 없다면, 모든 것이 못처럼 보일 것이다.나는 어떤 형식의 귀속으로 상상할 수 있는 모든 임무를 해결하려고 시도했다.원래 이것은 나쁜 생각이었다.
내가 귀속법으로 긴 줄의 피보나치 급수를 풀려고 시도했을 때, 나는 내 컴퓨터가 그것을 처리할 수 없다는 것을 갑자기 깨달았다.몇 시간 후에도 그것은 여전히 결과를 계산할 수 없다.충분히 밝히기;그것은 지금까지 이렇게 한 적이 없었다. 나는 포기하고 모든 빌어먹을 일을 닫았고, 나의 결정을 다시 생각하기 시작했고, 영원히 프로그래머가 되었다.왜 나는 랩을 배우지 않는지, 나는 본래 다음에 네가 알고 있는 제이지가 될 수 있었다.나는 무슨 일이 일어났는지 모른다.

그것은 내가 처음으로 최적화된 개념을 생각한 것이다.
만약 당신이 궁금한 유형이라면, 서열이 50에 달하는 최적화되지 않은 귀환 피보나치 급수를 실행합니다...내일 봐요.😃

그러면 최적화는 무엇일까요?


그렇다면 최적화가 무엇인지, 왜 경험이 없는 개발자로서도 그것을 고려해야 하는가.

An optimization algorithm is a procedure which is executed iteratively by comparing various solutions till an optimum or a satisfactory solution is found.


예를 들어 디자인 최적화에서 디자인 목표는 생산 원가를 간단하게 최소화하거나 생산 효율을 최대화할 수 있다.
지금, 무엇이 기억입니까?
나는 네가 내가'기억'을 잘못 맞췄다고 생각할 거라는 것을 안다.하지만 없어요.내 말은 기억이라고 확신한다.기억은 컴퓨터 과학의 용어로 복잡한 함수 호출 결과(함수가 실행 과정에서 많은 시간과 메모리를 소비하는 것)를 저장하고 같은 입력이나 파라미터가 다시 나타날 때 메모리에 저장된 결과를 되돌려 프로그램의 실행을 가속화시키는 기술이나 최적화 모델을 말한다.
으!!!,컴퓨터 과학은 그만해!나는 심지어 CS학위도 없는데, 너는 왜 나의 정의를 믿어야 하느냐.비밀번호 보여줄게.
나는 거의 프로그래밍에서 물러날 정도로 피보나치 등급을 계속 사용할 것이다.우리는 피보나치 함수의 최적화되지 않은 예시와 기억 최적화를 사용하는 다른 예시를 탐색할 것이다.

설치


차이를 가시화할 수 있다.우리는 약간의 일회성 설정이 필요하다.나는 자바스크립트 녀석이다. 나는 노드 환경을 사용할 것이다.익숙한 성능 지표를 사용할 수 있습니다.
코드 샌드박스 하나면 충분합니다.설치 및 요구 사항 perf-hooks.다음과 같이 성능 연결에서만 얻을 수 있습니다 performance.
const { performance } = require("perf_hooks");
이제 n번째 수의 피보나치 서열을 계산하는 함수를 작성합시다.
function fibonacci(n) {
  if (n === 0 || n === 1)
    return n;
  else
    return fibonacci(n - 1) + fibonacci(n - 2);
}
이 함수는 비교적 작은'n'값에 대해 양호하게 나타난다.그러나'n'이 증가함에 따라 성능은 빠르게 떨어진다.이것은 두 개의 귀속 호출이 같은 작업을 반복하기 때문이다.예를 들어 50번째 피보나치 수를 계산하려면 귀속 함수는 400억여 회(구체적으로 말하면 40730022147회)를 호출해야 한다!잠시 후 우리는 시각적으로 이 점을 볼 것이다.

노드 JS 피보나치 함수를 기억하다.


피보나치 함수의 메모리 버전에서 f () 를 되돌릴 때, 패키지를 닫으면'메모'대상에 계속 접근할 수 있습니다. 이 대상은 이전의 모든 결과를 저장합니다.f () 를 실행할 때마다 현재 값 "n"의 결과가 있는지 확인합니다.만약 그렇다면 캐시의 값을 되돌려줍니다.그렇지 않으면 원시 피보나 코드를 실행합니다."memo"는 f() 이외에 정의되어 있기 때문에 여러 함수 호출에서 값을 보존할 수 있습니다.
var memoizeFibonacci = 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;
};

성능과 성능을 비교하다.


이 두 함수로 30번째 피보나치 수를 계산하는 데 걸리는 시간을 상상해 봅시다.
//un-optimized
// time before function is executed
const startTime = performance.now();
fibonacci(20);
// time after function has completed computation
const endTime = performance.now();

console.log("Un-optimized time", endTime - startTime);

// memoized
const startTime2 = performance.now();
memoizeFibonacci(20);
// time after function has completed computation
const endTime2 = performance.now();

console.log("Optimized time", endTime2 - startTime2);
//result

Un-optimized:  1020.0609370004386
Optimized:  0.049122998490929604
너는 우리가 이미 계산 시간을 20000여 개의 수량 등급으로 증가시켰다는 것을 볼 수 있다.이것은 단지 30개의 숫자로 구성된 서열일 뿐이다.이 예는 간단합니다. 일상적인 임무와 비슷하지 않을 수도 있지만, 깊이 연구하면 프로그램에서 최적화할 수 있습니다.기억해라, 기억은 단지 최적화 방법일 뿐, 무수한 다른 전략이 있다.모든 문제를 망치처럼 대하지 마라.
또 주의해야 할 것은 우리가 기억의 표면에 거의 닿지 않았다는 것이다. 이것은 단지 우리의 두뇌가 각종 가능성에 대해 열려 있기 위해서이다.
그것이 효과가 있다는 사실은 결코 그것을 개선할 수 없다는 것을 의미하지 않는다.계속 최적화!
부: 제목이 좀 과장됐어요.이것은 마침 내 머릿속에 떠오르는 97번째 직함이다😃

좋은 웹페이지 즐겨찾기