Nell'ultimo anno di sviluppo del mio motore di scacchi (www.chessbin.com), la maggior parte del tempo è stato dedicato all'ottimizzazione del mio codice per consentire una ricerca di spostamento migliore e più veloce. In quel periodo ho imparato alcuni trucchi che vorrei condividere con voi.
di misurazione delle prestazioni
In sostanza è possibile migliorare le prestazioni in due modi:
- Valutare i nodi più veloce
- ricerca minor numero di nodi a venire con la stessa risposta
Il tuo primo problema nell'ottimizzazione del codice sarà la misurazione. Come sai che hai davvero fatto la differenza? Per aiutarti con questo problema, dovrai assicurarti di poter registrare alcune statistiche durante la tua ricerca. Quelle che catturo nel mio motore di scacchi sono:
- Il tempo impiegato per la ricerca è completo.
- Numero di nodi cercato
Questo vi permetterà di punto di riferimento e verificare le modifiche. Il modo migliore per affrontare i test è creare diversi salvataggi dalla posizione di apertura, dal gioco centrale e dal gioco finale. Registrare l'ora e il numero di nodi ricercati in bianco e nero. Dopo aver apportato qualche modifica, di solito eseguo dei test rispetto ai suddetti giochi di salvataggio per vedere se ho apportato miglioramenti alle due matrici precedenti: numero di nodi ricercati o velocità.
Per complicare ulteriormente le cose, dopo aver apportato un cambio di codice è possibile eseguire il motore 3 volte e ottenere ogni volta 3 risultati diversi. Diciamo che il tuo motore di scacchi ha trovato la migliore mossa in 9, 10 e 11 secondi. Quello è uno spread di circa il 20%. Quindi hai migliorato il tuo motore del 10% -20% o è stato solo un carico variabile sul tuo pc. Come lo sai? Per combattere questo ho aggiunto metodi che permetteranno al mio motore di giocare contro se stesso, farà mosse sia per il bianco che per il nero. In questo modo puoi testare non solo la varianza del tempo su una mossa, ma anche una serie di 50 mosse nel corso del gioco. Se l'ultima volta che il gioco ha impiegato 10 minuti e ora ne occorrono 9, probabilmente hai migliorato il tuo motore del 10%. Eseguire nuovamente il test dovrebbe confermare questo.
Prestazioni Trovare Utili
Ora che sappiamo come misurare miglioramenti delle prestazioni consente di discutere come identificare potenziali miglioramenti delle prestazioni.
Se si è in un ambiente .NET, il profiler .NET sarà tuo amico. Se si dispone di una versione di Visual Studio for Developers, viene fornita gratuitamente, tuttavia esistono altri strumenti di terze parti che è possibile utilizzare. Questo strumento mi ha permesso di risparmiare ore di lavoro in quanto ti dirà dove il tuo motore trascorre la maggior parte del suo tempo e ti consente di concentrarti sui punti problematici. Se non hai uno strumento profiler potresti dover in qualche modo registrare i timestamp mentre il tuo motore passa attraverso diversi passaggi. Non lo suggerisco. In questo caso un buon profiler vale il suo peso in oro. Red Gate ANTS Profiler è costoso ma il migliore che abbia mai provato. Se non puoi permetterti uno, almeno lo usi per la loro prova di 14 giorni.
vostro profiler sarà burbero identificare le cose per voi, ma qui ci sono alcune piccole lezioni che ho imparato a lavorare con C#:
- Rendere tutto privato
- Tutto ciò che non è possibile effettuare privata, rendono sigillato
- Possibile eseguire molti metodi statici come .
- Non rendere i tuoi metodi chiacchieroni, un metodo lungo è meglio di 4 più piccoli .
- La scacchiera memorizzata come array [8] [8] è più lenta di un array di [64]
- Sostituisci int con byte laddove possibile.
- È possibile tornare dai propri metodi già a partire da .
- Le pile sono migliori degli elenchi
- Gli array sono migliori delle pile e degli elenchi .
- Se è possibile definire la dimensione dell'elenco prima di popolarlo.
- Casting, boxing, un-boxing è il male.
ulteriori guadagni di prestazione:
trovo generazione mossa e l'ordinazione è estremamente importante. Comunque qui è il problema come lo vedo io. Se valuti il punteggio di ogni mossa prima di ordinare ed eseguire Alpha Beta, sarai in grado di ottimizzare il tuo ordine di movimento in modo tale da ottenere riduzioni estremamente veloci di Alpha Beta. Questo perché sarai in grado di provare per prima cosa la migliore mossa. Tuttavia, il tempo impiegato per valutare ogni mossa sarà sprecato. Ad esempio potresti aver valutato il punteggio su 20 mosse, ordinare le tue mosse, provare i primi 2 e ricevere un cut-off sul numero di mossa 2. In teoria il tempo che hai speso per le altre 18 mosse è stato sprecato.
D'altra parte se si effettua una valutazione più leggera e molto più veloce dire solo acquisizioni, il tuo ordinamento non sarà così buono e dovrai cercare più nodi (fino al 60% in più). D'altra parte non dovresti fare una valutazione pesante su ogni mossa possibile. Nel complesso, questo approccio è in genere più veloce.
Trovare questo perfetto equilibrio tra avere abbastanza informazioni per un buon tipo e non fare un lavoro extra su mosse che non userete, vi permetterà di trovare enormi guadagni nell'algoritmo di ricerca. Inoltre, se si sceglie l'approccio di ordinamento più povero, si vorrà prima eseguire una ricerca meno profonda, dire a ply 3, ordinare la propria mossa prima di andare nella ricerca più profonda (questo è spesso chiamato approfondimento iterativo). Ciò migliorerà in modo significativo il tuo ordinamento e ti consentirà di cercare molte meno mosse.
È possibile modificare il proprio post (ovvero domanda o risposta) per inserire informazioni aggiuntive come questa. Basta fare clic sul link "modifica" sotto il post. – balpha
Solo per curiosità, hai qualche idea approssimativa di quanto è buono (in termini di punteggio Elo) il tuo programma? Sono un grande appassionato di scacchi e ho pensato di scrivere un programma di scacchi per anni. So che i programmi all'avanguardia sono poco più di un front-end per enormi database e mi piacerebbe vedere quanto qualcuno possa fare un buon algoritmo di apprendimento. –
Farò un secondo commento sulle fatture. Sarebbe davvero interessante vedere il tuo programma di scacchi una volta operativo (o anche adesso, sembra che tu abbia lavorato molto su di esso) – samoz