Piero V.

Benchmark natsort al contrario

Sta notte, mentre non riuscivo a dormire mi sono chiesto se è più veloce natsort con array_reverse oppure usort con -strnatcmp.

La risposta più o meno me l’aspettavo già, però non pensavo la differenza fosse così tanto abissale come vi farò vedere dopo.

Come benchmark ho generato un array col ciclo for di 10^6 elementi e poi li ho messi a caso. Ho dato ad entrambe le funzioni il medesimo array, in modo da fare un test il meno influenzato possibile.

Ho eseguito il test sia per il for che incrementa i valori ($i++), sia per quello che li decrementa ($i–).

Un’ultima considerazione: secondo me non sono importanti i risultati assoluti ma quelli relativi, in quanto non volevo fare il test della macchina, che so non essere tra le migliori.

Insomma, so che si potrebbe fare senza dubbio di meglio come test, magari anche in 64bit.

Ed ecco i risultati:

VDFN Benchmark

Natsort al contrario, for crescente.

Natsort + array_reverse
Tempo: 31.985618114471s
Memoria di picco: 175.97104263306MB

usort (-strnatcmp)
Tempo: 74.302319049835s
Memoria di picco: 175.97214508057MB

Come vedete con usort e il mio callback ci mette più del doppio, mentre la RAM ha valori molto, molto vicini.

Però mi sono chiesto quanto cambiasse dal natsort a usort con strnatcmp, per vedere cosa influisce veramente:

VDFN Benchmark

Natsort, for crescente.

Natsort
Tempo: 30.119038820267s
Memoria di picco: 175.97071456909MB

usort (strnatcmp)
Tempo: 81.1479139328s
Memoria di picco: 175.97214508057MB

Con questi dati ci ha messo di più… Deve essere andato male il test, così l’ho rifatto, usando accidentalmente altri dati. Eccolo:

VDFN Benchmark

Natsort, for crescente.

Natsort + array_reverse
Tempo: 26.241199970245s
Memoria di picco: 175.97071456909MB

usort (strnatcmp)
Tempo: 64.931766986847s
Memoria di picco: 175.97217178345MB

Questo mi sembra molto meglio. Si vede subito che in realtà l’ordine decrescente non fa cambiare quasi niente: in realtà è che, come mi aspettavo, le funzioni built-in di PHP sono molto, molto, molto più veloci. Non mi aspettavo però un rapporto del genere. La media del rapporto di questo con altri test fatti in precedenza è del 2,5.

Ho provato comunque a cercare di avvantaggiare il callback dando già in un ordine più tendente al decrescente che al crescente usando il for decrescente, ma le cose non sono andate molto diversamente, anzi, mi pare quasi peggio:

VDFN Benchmark

Natsort al contrario, for decrescente.

Natsort + array_reverse
Tempo: 28.863711833954s
Memoria di picco: 175.97120666504MB

usort (-strnatcmp)
Tempo: 87.613072156906s
Memoria di picco: 175.97230911255MB

VDFN Benchmark

Natsort, for decrescente.

Natsort
Tempo: 31.476179838181s
Memoria di picco: 175.97088623047MB

usort (strnatcmp)
Tempo: 74.474761009216s
Memoria di picco: 175.97230911255MB

Se qualcuno volesse fare altri test, metto a disposizione gli script da me usati e mi faccia sapere che risultati ottiene, magari via commento.