ho un applicazione che improvvisamente inizia a richiedere risorse
infinite,
questo succede quando carico una view che deve mostrarmi un elenco di
eventi filtrati per data e posizionarli in una tabella ho un ciclo di
questo tipo:
result = %(
)
(9…19).each do |hour|
result << %(
)
(0…6).each do |day|
result << %(
#{ get_event(day, hour) }
)
end
result << %(
)
end
result << %(
)
get_event prende i dati da una hash strutturata così:
eventi = { day_1 => { 9 => [events], 10 => [events], …}, day_2 =>
… }
mi verrebbe da chiedere: quanto è grande l’hash eventi e quanto sono
grandi i suoi valori? E’ possibile che la to_s diventi impegnativa.
Bisognerebbe però lanciare un profiler per sapere dove passa il suo
tempo l’applicazione.
Paolo
Alessandro S. wrote:
ho un applicazione che improvvisamente inizia a richiedere risorse
infinite,
questo succede quando carico una view che deve mostrarmi un elenco di
eventi filtrati per data e posizionarli in una tabella ho un ciclo di
questo tipo:
result = %(
)
(9…19).each do |hour|
result << %(
)
(0…6).each do |day|
result << %(
#{ get_event(day, hour) }
)
end
result << %(
)
end
result << %(
)
get_event prende i dati da una hash strutturata così:
eventi = { day_1 => { 9 => [events], 10 => [events], …}, day_2 =>
… }
mi verrebbe da chiedere: quanto è grande l’hash eventi e quanto sono
grandi i suoi valori?
L’hash contiene oggetti di tipo evento molto “piccoli” 4 campi di
tabellari (nome descrizione data utente id) ed è quasi sempre vuoto
durante i test per cui dovrebbe andare a razzo …
E’ possibile che la to_s diventi impegnativa.
Bisognerebbe però lanciare un profiler per sapere dove passa il suo
tempo l’applicazione.
4 ore di prove e test e ho risolto, tutto dipendeva da strftime, per le
date non è performante conviene fare a mano ad
es.
“#{data.day}-#{data.month}-#{data.year}” vs data.strftime("%d-%m-%Y")
differenza quasi 0.2 secondi!!!
(il primo è istantaneo)
4 ore di prove e test e ho risolto, tutto dipendeva da strftime, per le
date non è performante conviene fare a mano ad
es.
“#{data.day}-#{data.month}-#{data.year}” vs data.strftime(“%d-%m-%Y”)
differenza quasi 0.2 secondi!!!
(il primo è istantaneo)
Si impara sempre qualcosa di nuovo!
Fantastico! Googlando dopo questa notizia ho trovato Date::Performance,
una gemma che riscrive l’implementazione della classe Date in C.
L’applicazione Rails su cui sto lavorando invece continua a funzionare
dopo la require ‘date/performance’ per cui tutto bene. Solo che non era
lenta prima e non pare più veloce adesso, anche se di strftime ne usa.
Se Alessandro avesse ancora a portata di mano il profiler forse potrebbe
dirci se questa nuova strftime è veloce quanto dice. Sarebbe meglio una
strftime veloce che la conversione manuale, no?
4 ore di prove e test e ho risolto, tutto dipendeva da strftime, per le
date non è performante conviene fare a mano ad
es.
“#{data.day}-#{data.month}-#{data.year}” vs data.strftime(“%d-%m-%Y”)
differenza quasi 0.2 secondi!!!
(il primo è istantaneo)
Si impara sempre qualcosa di nuovo!
Fantastico! Googlando dopo questa notizia ho trovato Date::Performance,
una gemma che riscrive l’implementazione della classe Date in C.
L’applicazione Rails su cui sto lavorando invece continua a funzionare
dopo la require ‘date/performance’ per cui tutto bene. Solo che non era
lenta prima e non pare più veloce adesso, anche se di strftime ne usa.
Se Alessandro avesse ancora a portata di mano il profiler forse potrebbe
dirci se questa nuova strftime è veloce quanto dice. Sarebbe meglio una
strftime veloce che la conversione manuale, no?
Paolo
Bhe ho fatto un pò di test (un bel pò) non ho installato
date-performance (che avevo trovato anche io ) per quei messaggi
inquietanti…
Allora sulla classe Date passando da una chiamata strftime a una
“manuale” risparmio in media 1 decimo di secondo, se nel codice hai
poche chiamate non te ne accorgi, ma un ciclo come il mio che ne
eseguiva una 60-70ina inizia a diventare doloroso…
appena ho 1 oretta faccio una serie di test con profiler sulle 3 classi
e pubblico i risultati
Ottimo lavoro. Ne ho approfittato per inserire come commento i risultati
dei benchmark con date-performance.
Riassunto: Date.strftime si velocizza di 60 volte. I dettagli sono sul
blog.
La installo subito!
(analizzando i benchmark ho notato che la lentezza di date deriva da un
sacco di chiamate alla classe String che come detto in precedenza è iper
lenta)
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.