Far contare GML, array e ds_list.

Scripts e snippets scritti in GameMaker Language (gml)
Rispondi
Avatar utente
boxbuilder
Membro
Messaggi: 158
Iscritto il: 25/06/2015, 10:37
Specialità: programmatore
Uso: GM:Studio 1.4 HTML5
Contatta:

Far contare GML, array e ds_list.

Messaggio da boxbuilder »

Ciao,
ho provato a far contare gml da 0 a 100000 e a fargli salvare tutti i valori all'interno di array o ds_list. Ecco quanto ha impiegato il mio pc ad eseguire questo task:

ciclo vuoto (23 millisecondi):

Codice: Seleziona tutto

for(var i = 0 ; i < 100000 ; i++) {
}
ds_list (ds_list_add) (48 millisecondi):

Codice: Seleziona tutto

list = ds_list_create();
for(var i = 0 ; i < 100000 ; i++) {
	ds_list_add(list, i);
}
ds_list (accessors) (2504 millisecondi):

Codice: Seleziona tutto

list = ds_list_create();
for(var i = 0 ; i < 100000 ; i++) {
	list[| i] = i;
}
array dimensionato (6149 millisecondi):

Codice: Seleziona tutto

list[100000] = 100000;
for(var i = 0 ; i < 100000 ; i++) {
    list[i] = i;
}
array non dimensionato (6205 millisecondi):

Codice: Seleziona tutto

for(var i = 0 ; i < 100000 ; i++) {
    list[i] = i;
}
Diciamo che era tutto abbastanza scontato.

Avatar utente
Cash
Membro super
Messaggi: 933
Iscritto il: 09/11/2013, 20:40
Uso: GM:Studio 1.4 Pro
Contatta:

Re: Far contare GML, array e ds_list.

Messaggio da Cash »

Ma un array dimensionato non dovrebbe essere più veloce di tutti? è solo memoria allocata mentre gli altri sono strutture dati dinamiche

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Far contare GML, array e ds_list.

Messaggio da Jak »

Saper ciucciare prestazioni con GM è un'arte. Non dare tutto per scontato.
Prima di tutto le liste sono implementate esattamente come gli array e pertanto segue le stesse proprietà per la sua allocazione quali il predimensionamento che hai effettuato con l'array, l'unica differenza è che ogni accesso include una chiamata a funzione che quindi rallenta il tutto.
Viceversa gli array, a meno che abbiano cambiato qualcosa di recentissimo ma mi pare di no, hanno una dimensione massima di 30000. Con GMS andare oltre non causa errore ma soltanto "enormi" rallentamenti. (e forse pure valori a cazzo)
Tutta fonte di pura esperienza chiaramente, nessun manuale.
Ora non mi viene in mente come mai gli accessors causino quei rallentamenti. Che versione di GM usi?
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
boxbuilder
Membro
Messaggi: 158
Iscritto il: 25/06/2015, 10:37
Specialità: programmatore
Uso: GM:Studio 1.4 HTML5
Contatta:

Re: Far contare GML, array e ds_list.

Messaggio da boxbuilder »

Jak ha scritto:Ora non mi viene in mente come mai gli accessors causino quei rallentamenti. Che versione di GM usi?
Ciao, uso Studio 1.4 e 1.9 beta.
Non so se prenderò mai Studio 2.0, mi sembra un tool troppo costoso per quello che offre, magari aspetto quando sarà su humble bundle.

Sul sito non ho trovato molte informazioni su come lavorano le ds_ e gli accessors, ma ero abbastanza convinto che gli array sarebbero stati più performanti.

dovrò provare a scriverne i valori con questa sintassi:

Codice: Seleziona tutto

a = argument0;
a[0] = 100;        // The array will be copied and the copy modified
a[@0] = 100;       // This will modified the ORIGINAL array directly
sono sicuro che potrebbero esserci delle sorprese.

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Far contare GML, array e ds_list.

Messaggio da Jak »

Gli array SONO più veloci delle ds, sono lentissimi solo nel caso ne fai di dimensioni superiori a 30000. Finchè stai sotto nessun problema, e siccome superarlo anche se possibile non è ufficialmente supportato, e che quindi potrebbero cambiarli da una versione all'altra, è preferibile non superare questa cifra a prescindere, al di sopra usa SEMPRE le ds.
Gli accessors per gli array sono utili in determinate condizioni ma dove non strettamente necessario meglio evitare di usarli in quanto molto più lenti di un'utilizzo standard. Con gli array più piccoli spesso è meglio copiarli e quindi ricrearli piuttosto che usare gli accessors.
Consiglio veloce: per la semplice lettura non usare MAI gli accessors sugli array, provoca solo rallentamenti e non cè nessun motivo a livello di utilizzo che ti costringa a farlo.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti