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.