> Esercitazione LeekScript
Qui parleremo di ottimizzazione, l'obiettivo dell'ottimizzazione è migliorare le prestazioni di un algoritmo. In generale, quando si parla di ottimizzazione si parla di tempo di esecuzione, con l'obiettivo di ridurre il tempo necessario per eseguire una serie di istruzioni.
In LeekScript, questo tempo di esecuzione è stimato da un numero: il numero di operazioni utilizzate da questo calcolo. Parleremo quindi di alcune buone pratiche e buoni riflessi per l'ottimizzazione di un programma, qualunque sia il linguaggio, nonché di alcune ottimizzazioni più specifiche di LeekScript e intimamente legate al modo in cui vengono conteggiate le operazioni.
Se non lo hai già fatto, ti invito a leggere l'articolo LeekScript Tutorial: Operations.
Ad esempio, il salvataggio di 500 operazioni su una funzione chiamata solo una volta salverà solo 500 operazioni. (logica) D'altra parte, il risparmio di una singola operazione, su una funzione chiamata in un loop di loop di loop può ridurre il costo in operazioni di diverse decine di migliaia di operazioni.
Il che mi porta al secondo punto:
Metà del lavoro di ottimizzazione di un codice consiste semplicemente nel cercare da dove partono le operazioni (poi devi gridare forte e dire loro di tornare indietro). Cosa è costoso nel codice?
Per questo, nessun segreto, misureremo!
Nel nostro arsenale, il LeekScript fornisce una funzione che si rivelerà molto utile: getOperations. Questa funzione permette di conoscere il numero di operazioni spese finora nel codice.
Esempio di un semplice strumento per misurare il costo di una funzione:
Possiamo così confermare che dire costa 30 operazioni, come annunciato dalla documentazione.
È possibile, e consiglio vivamente di creare strumenti per misurare altre cose nella tua IA, come il numero di chiamate a una funzione, così come il suo costo medio, ad esempio, che misurerà meglio l'evoluzione dei costi nella tua IA, e l'impatto di alcune ottimizzazioni.
La pagina Complessità ti aiuterà a capire perché un algoritmo è costoso e come risolvere il problema. Per riassumere in modo molto semplice, preferiamo evitare il più possibile di annidare i loop tra di loro. Cercheremo anche di limitare la dimensione dei nostri loop, ad esempio sfogliando solo le nostre celle accessibili invece di sfogliare tutte le celle della mappa. È importante notare che un algoritmo con una complessità inferiore utilizzerà molto meno operazioni per elaborare un numero sufficientemente elevato di elementi, pensaci prima di provare a grattare piccole ottimizzazioni!
Immagina il seguente codice:
La funzione getNearestEnemy verrà chiamata ad ogni iterazione del ciclo mentre restituirà sempre lo stesso risultato! Per evitare ciò, basta inserire il risultato in una variabile prima della funzione. Facciamo la stessa cosa per floor(TP / getWeaponCost(getWeapon())) che viene anch'esso valutato ad ogni iterazione. Che danno:
inArray, il inArray è pratico, fa quello che vogliamo, ma comporta un costo notevole nelle operazioni che non necessariamente notiamo a prima vista. In effetti, all'interno si presenta così:
Questo esempio è una buona illustrazione per parlare di un po' di complessità. Vediamo qui che il costo reale di questa funzione dipende nel peggiore dei casi dalla dimensione dell'array array, che chiameremo n*. Questa funzione ha quindi una complessità *n, lo è
Impossible de charger les données du jeu.
Vérifiez votre connexion et réessayez.