최적화

최적화

> LeekScript 튜토리얼

여기서 우리는 최적화에 대해 이야기할 것입니다. 최적화의 목적은 알고리즘의 성능을 향상시키는 것입니다. 일반적으로 최적화에 대해 이야기할 때 일련의 명령을 실행하는 데 필요한 시간을 줄이는 것이 목표인 실행 시간에 대해 이야기합니다.

LeekScript에서 이 실행 시간은 숫자, 즉 이 계산에 사용된 작업 수로 추정됩니다. 따라서 우리는 언어에 관계없이 프로그램을 최적화하기 위한 특정 모범 사례와 좋은 반응뿐만 아니라 LeekScript에 더 구체적이고 작업이 계산되는 방식과 밀접하게 연결된 특정 최적화에 대해 이야기할 것입니다.

아직 읽어보지 않았다면 LeekScript Tutorial 문서: Operations를 읽어 보시기 바랍니다.

좋은 반사 신경

예를 들어 한 번만 호출되는 함수에 대해 500개의 작업을 저장하면 500개의 작업만 저장됩니다. (논리) 반면에 루프 루프에서 호출되는 함수에 대한 단일 작업을 절약하면 수만 번의 작업 작업 비용을 줄일 수 있습니다.

두 번째 요점은 다음과 같습니다.

코드를 최적화하는 작업의 절반은 단순히 작업이 종료되는 위치를 찾는 것으로 구성됩니다. 코드에서 비싼 것은 무엇입니까?

이를 위해 비밀이 아닙니다. 측정하겠습니다!

우리 무기고에서 LeekScript는 getOperations라는 매우 유용한 기능을 제공합니다. 이 함수를 사용하면 코드에서 지금까지 사용한 작업 수를 알 수 있습니다.

함수 비용을 측정하는 간단한 도구의 예:

글로벌 __debug_operation; 함수 startOp(){ __debug_operation = getOperations(); } 함수 stopOp(제목){ let ops = getOperations()-__debug_operation - 3; debug("작업(" + 제목 + "): " + 작업); }

startOp(); stopOp("빈 테스트"); // 빈 테스트: 0

startOp(); say("안녕하세요."); stopOp("안녕하세요."); // 안녕하세요 세계: 30

따라서 문서에서 발표한 대로 30개의 작업 비용이 든다는 것을 확인할 수 있습니다.

가능하며, AI의 비용 변화를 더 잘 측정할 수 있는 평균 비용뿐만 아니라 함수 호출 수와 같은 AI의 다른 항목을 측정하는 도구를 만드는 것이 좋습니다. 특정 최적화의 영향.

복잡성 페이지는 알고리즘이 비싼 이유와 문제를 해결하는 방법을 이해하는 데 도움이 됩니다. 매우 간단하게 요약하면 가능한 한 그들 사이에 중첩 루프를 피하는 것이 좋습니다. 또한 예를 들어 맵의 모든 셀을 탐색하는 대신 액세스 가능한 셀만 탐색하여 루프의 크기를 제한하려고 합니다. 복잡성이 낮은 알고리즘은 처리할 수 있는 충분한 수의 항목에 대해 훨씬 더 적은 작업을 사용한다는 점에 유의하는 것이 중요합니다. 작은 최적화를 시도하기 전에 이를 고려하십시오!

변경되지 않는 루프 제거

다음 코드를 상상해 보십시오.

let TP = getTP();

// 적에게 최대한 많이 쏴라! for (var i = 0; i < floor(TP / getWeaponCost(getWeapon())); i++) { useWeapon(getNearestEnemy()); }

getNearestEnemy 함수는 루프가 반복될 때마다 호출되며 항상 동일한 결과를 반환합니다! 이를 피하려면 결과를 함수 앞에 변수에 넣으십시오. 각 반복에서 평가되는 floor(TP / getWeaponCost(getWeapon()))에 대해서도 동일한 작업을 수행합니다. 주는 것 :

let TP = getTP();

// 적에게 최대한 많이 쏴라! var 적 = getNearestEnemy(); var nbShots = floor(TP / getWeaponCost(getWeapon())); // 현재 무기로 가능한 발사 수 for (var i = 0; i < nbShots; i++) { useWeapon(적); }

부추전쟁이 비싸다는 특징

inArray, inArray는 실용적이고 우리가 원하는 것을 수행하지만 언뜻 보기에 반드시 알아차리지 못하는 상당한 작업 비용이 수반됩니다. 실제로 내부는 이렇게 생겼습니다.

함수 inArray(요소, 배열){ for (배열의 var 값) if(값 == 요소) true를 반환합니다. 거짓을 반환합니다. }

이 예는 약간의 복잡성에 대해 이야기하는 좋은 예입니다. 여기서 이 함수의 실제 비용은 최악의 경우 배열 배열의 크기에 따라 달라지며 이름을 n*으로 지정합니다. 따라서 이 함수는 복잡도 *n을 갖습니다.