Ruby – Ancora sulle Prestazioni
Mi è stato chiesto di documentare le mie osservazioni sulle performance della formattazione di oggetti di tipo Date, DateTime, Time.
A seguito una serie di test di verifica delle prestazioni.Questi test sono stati eseguiti su un DualCore T9500 (2.6ghz) 4 GB ram sistema operativo Ubuntu 8.10 intrepid.
Questo il codice usato per eseguire i test:
require 'ruby-prof'
MAX = 50000
class CodeProfiler
def self.time_this(comment, &block)
RubyProf.measure_mode = RubyProf::PROCESS_TIME
RubyProf.start
yield
result = RubyProf.stop
puts "nTimings for #{comment}"
printer = RubyProf::FlatPrinter.new(result)
printer.print(STDOUT, 0)
end
end
CodeProfiler.time_this("Class Date -> strftime("%d/%m/%Y"):") {
x = ''
t = Date.new()
(0..MAX).each do |i|
x = t.strftime("%d/%m/%Y")
end
}
CodeProfiler.time_this('Class Date -> #{t.day}/#{t.month}/#{t.year}:') {
x = ''
t = Date.new()
(0..MAX).each do |i|
x = "#{t.day}/#{t.month}/#{t.year}"
end
}
CodeProfiler.time_this("Class DateTime -> strftime("%d/%m/%Y %H:%M"):") {
x = ''
t = DateTime.new()
(0..MAX).each do |i|
x = t.strftime("%d/%m/%Y %H:%M")
end
}
CodeProfiler.time_this('Class DateTime -> #{t.day}/#{t.month}/#{t.year} #{t.hour}:#{t.min}:') {
x = ''
t = DateTime.new()
(0..MAX).each do |i|
x = "#{t.day}/#{t.month}/#{t.year} #{t.hour}:#{t.min}"
end
}
CodeProfiler.time_this("Class Time -> strftime("%d/%m/%Y %H:%M"):") {
x = ''
t = Time.new()
(0..MAX).each do |i|
x = t.strftime("%d/%m/%Y %H:%M")
end
}
CodeProfiler.time_this('Class Time -> #{t.day}/#{t.month}/#{t.year} #{t.hour}:#{t.min}:') {
x = ''
t = Time.new()
(0..MAX).each do |i|
x = "#{t.day}/#{t.month}/#{t.year} #{t.hour}:#{t.min}"
end
}
Risultati
Timings for Class Date -> strftime("%d/%m/%Y"):
Thread ID: 70286299744000
Total: 14.590000
Timings for Class Date -> #{t.day}/#{t.month}/#{t.year}:
Thread ID: 70286299744000
Total: 0.880000
Timings for Class DateTime -> strftime("%d/%m/%Y %H:%M"):
Thread ID: 70286299744000
Total: 22.800000
Timings for Class DateTime -> #{t.day}/#{t.month}/#{t.year} #{t.hour}:#{t.min}:
Thread ID: 70286299744000
Total: 1.500000
Timings for Class Time -> strftime("%d/%m/%Y %H:%M"):
Thread ID: 70286299744000
Total: 0.190000
Timings for Class Time -> #{t.day}/#{t.month}/#{t.year} #{t.hour}:#{t.min}:
Thread ID: 70286299744000
Total: 0.550000
Conclusioni
Da questi test si può ricavare come solamente la classe time sia performante nell'uso del metodo strftime, sconsiglio quindi l'uso di questo metodo su oggetti di tipo Date e DateTime.