Cominceremo col non fare assolutamente niente! Ma lo faremo con stile… Può sembrare strano, ma chi più chi meno, puntano tutti il dito sui cicli dicendo che, specialmente in GDScript, sono da sfinimento. Quindi ho pensato di creare due classe di benchmark gemelle, come predetto, che non fanno assolutamente niente: si limitano a contare per 5.000.000 di volte e basta. Iniziamo dalla classe in GDScript.


Come si può vedere in Fig.14, la classe eredita da GDBenchmarkWork, come predetto. Ne sovrascrive i metodi _benchmark e _log_message, gli unici che serve sovrascrivere. In particolare, il metodo _benchmark è strutturato in modo da eseguire un ciclo per 5.000.000 di volte, come anticipato. Nel frattempo incrementa di una unità il valore di una variabile chiamata i che utilizzeremo per stampare un messaggio, a riprova che i cicli siano effettivamente stati eseguiti. Nient’altro.
In Fig.15 troviamo la controparte in C++, sempre divisa tra un file di header ed uno in cui sono dichiarati i contenuti dei metodi. Anche questa classe discende da GDBenchmarkWork come la precedente. Nel caso della classe in C++, si è preferito evitare l’operatore di incremento ++, notoriamente molto veloce, per preferirgli lo stesso operatore += utilizzato anche nella classe GDScript.
Visto che questo è il primo benchmark completo, aggiungo un paio di cosette. Siccome, questa volta, non siamo assolutamente interessati al binding dei metodi, visto che questa classe verrà utilizzata così com’è senza overriding, notate che tutte le macro dedicate al virtual binding sono state omesse. Inoltre, è stato fatto l’override del metodo statico _bind_methods che a rigor di logica non dovrebbe servire, ma siccome in GDBenchmarkWork nel metodo corrispondente ci abbiamo messo del codice per motivi pedagogici, siamo costretti a sovrascriverlo con un metodo vuoto. Lo teniamo così, fa niente! Ovvio che, in un contesto più serio, forse è il caso di pensare ad una classe all’origine della gerarchia con tutti i metodi vuoti. Ricordiamoci anche che la classe va dichiarata in register_types.cpp affinché Godot possa vederla dall’IDE. Per fare ciò, basta aggiungere una nuova macro in corrispondenza di quella già esistente, nonché un riferimento al file di header di questa nuova classe. Quindi, la prima parte di register_types.cpp apparirà così:
#include "register_types.h"
#include "gdbenchmarkwork.h"
#include "gdbenchmarklotofnothing.h"
#include <gdextension_interface.h>
#include <godot_cpp/core/defs.hpp>
#include <godot_cpp/godot.hpp>
using namespace godot;
void initialize_benchmark_module(ModuleInitializationLevel p_level) {
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
return;
}
GDREGISTER_RUNTIME_CLASS(GDBenchmarkWork);
GDREGISTER_RUNTIME_CLASS(GDBenchmarkLotOfNothing);
}
(Omissis)
Ovviamente, una volta creata la classe C++, occorre lanciare SCons per ricompilare la DLL che contiene, a questo punto, entrambe le classi, quella precedentemente creata (GDBenchmarkWork ) e quella nuova(GDBenchmarkLotOfNothing).
A questo punto, potremmo anche maneggiare la classe Benckmark scritta in GDScript, andando a modificare il metodo _prepare_works_array () in questo modo:
func _prepare_works_array() -> void:
# Aggiungeremo le varie classi per il benchmark qui
works.append(BenchmarkLotOfNothing.new())
works.append(GDBenchmarkLotOfNothing.new())
for work in works:
add_child(work)
work.job_ended.connect(_work_ended)
Come vedete, le classi sono create al volo con il metodo standard di GDScript new().
Possiamo provare ad avviare, per la prima volta, il nostro benchmark. Quello che si noterà è l’apertura di una finestra che rimarrà vuota, ma allo stesso tempo comparirà del testo nel riquadro Output dell’IDE di Godot. Dovreste vedere qualcosa di questo genere:
— GDScript ha fatto niente per 5000000 volte
Molto di niente in GDScript –> 98337 usec
— GDExtension ha fatto niente per 5000000 volte
Molto di niente in GDExtension –> 229 usec
Benchmark finito!
E’ sconvolgente, vero? Pare proprio che il codice in C++ sia qualcosa come più di 400 volte più veloce del corrispondente codice in GDScript, almeno in materia di cicli inutili. Vedremo cosa succede con altre classi che creeremo prossimamente.