Optimointi

#Optimointi > LeekScript-opetusohjelma

Tässä puhutaan optimoinnista, optimoinnin tavoitteena on parantaa algoritmin suorituskykyä. Yleensä kun puhumme optimoinnista, puhumme suoritusajasta, jonka tavoitteena on lyhentää käskysarjan suorittamiseen tarvittavaa aikaa.

LeekScriptissä tämä suoritusaika arvioidaan luvulla: tässä laskelmassa käytettyjen operaatioiden määrä. Siksi aiomme puhua tietyistä hyvistä käytännöistä ja hyvistä reflekseistä ohjelman optimointiin kielestä riippumatta, sekä tietyistä LeekScriptille erityisemmistä optimoinneista, jotka liittyvät läheisesti toimintojen laskentatapaan.

Jos et ole jo tehnyt niin, pyydän sinua lukemaan LeekScript Tutorial-artikkelin: Operations.

Hyvät refleksit

Esimerkiksi 500 toiminnon tallentaminen vain kerran kutsuttuun funktioon tallentaa vain 500 toimintoa. (logiikka) Toisaalta yksittäisen toiminnon säästäminen silmukan silmukassa kutsutussa funktiossa voi vähentää useiden kymmenien tuhansien toimintojen kustannuksia.

Tästä pääsenkin toiseen kohtaan:

Puolet koodin optimoinnin työstä koostuu yksinkertaisesti etsimisestä, mistä toiminnot lähtevät (sitten sinun täytyy huutaa kovaa ja käskeä heitä palaamaan). Mikä koodissa on kallista?

Sitä varten, ei mikään salaisuus, me mittaamme!

Arsenaalissamme LeekScript tarjoaa toiminnon, joka osoittautuu erittäin hyödylliseksi: getOperations. Tämän toiminnon avulla voit tietää koodissa tähän mennessä käytettyjen toimintojen määrän.

Esimerkki yksinkertaisesta työkalusta funktion kustannusten mittaamiseen:

globaali __debug_operation; function startOp(){ __debug_operation = getOperations(); } function stopOp(title){ let ops = getOperations()-__debug_operation - 3; debug("Toiminnot (" + otsikko + "): " + ops); }

startOp(); stopOp("tyhjä testi"); // tyhjä testi: 0

startOp(); sano("hei maailma"); stopOp("hei maailma"); // hei maailma: 30

Voimme siis vahvistaa, että se maksaa 30 operaatiota, kuten dokumentaatiossa kerrotaan.

On mahdollista, ja suosittelen vahvasti, että teet työkaluja mittaamaan tekoälyssäsi muita asioita, kuten toimintoon soitettujen puheluiden määrää sekä esimerkiksi sen keskimääräisiä kustannuksia, mikä mittaa paremmin tekoälysi kustannuskehitystä, ja tiettyjen optimointien vaikutus.

Monimutkaisuus -sivu auttaa sinua ymmärtämään, miksi algoritmi on kallis ja miten ongelma ratkaistaan. Lyhyesti sanottuna pidämme parempana välttää sisäkkäisiä silmukoita niiden välillä niin pitkälle kuin mahdollista. Pyrimme myös rajoittamaan silmukoidemme kokoa, esimerkiksi selaamalla vain käytettävissä olevia solujamme sen sijaan, että selaamme kaikkia kartan soluja. On tärkeää huomata, että algoritmi, jonka monimutkaisuus on pienempi, käyttää paljon vähemmän operaatioita riittävän suurelle määrälle kohdetta käsiteltäväksi. Mieti sitä ennen kuin yrität raaputtaa pieniä optimointeja!

Silmukoiden poistaminen, jotka eivät muutu

Kuvittele seuraava koodi:

anna TP = getTP();

// Ammu niin monta kertaa kuin mahdollista vihollista kohti! for (var i = 0; i < floor(TP / getWeaponCost(getWeapon())); i++) { useWeapon(getLähivihollinen()); }

getNearestEnemy-funktiota kutsutaan jokaisessa silmukan iteraatiossa, mutta se palauttaa aina saman tuloksen! Tämän välttämiseksi laita tulos muuttujaan ennen funktiota. Teemme saman komennolla "floor(TP / getWeaponCost(getWeapon()))", joka myös arvioidaan jokaisessa iteraatiossa. Mikä antaa:

anna TP = getTP();

// Ammu niin monta kertaa kuin mahdollista vihollista kohti! var vihollinen = getNearestEnemy(); var nbShots = floor(TP / getWeaponCost(getWeapon())); // mahdollisten laukausten määrä nykyisellä aseella for (var i = 0; i < nbShots; i++) { käytäAse (vihollinen); }

Leek Wars -ominaisuudet ovat kalliita

inArray, inArray on käytännöllinen, se tekee mitä haluamme, mutta siihen liittyy huomattavia kustannuksia operaatioissa, joita emme välttämättä huomaa ensi silmäyksellä. Itse asiassa sisältä se näyttää tältä:

function inArray(elementti, array){ for (var arvo taulukossa) jos (arvo == tuote) palauttaa tosi; palauttaa väärä; }

Tämä esimerkki on hyvä esimerkki puhua hieman monimutkaisuudesta. Näemme tässä, että tämän funktion todellinen hinta riippuu pahimmassa tapauksessa taulukon koosta, jolle annamme nimen n*. Tämän funktion monimutkaisuus on siis *n, se on