Venkite Date (Date vs Time battle)

Kalbant apie Ruby ir datos parsinimą. Jei tik įmanoma (o tai padaryti galima visada), venkite Date objekto, nes jis labai lėtas. Jeigu aktyviai dirbate su datomis (tarkime, kokia nors su kalendoriumi reikalų turinti aplikacija) tai išgelbės daug vargo valandų aiškinantis kodėl čia viskas taip lėta.Dažniausias atvejis turbūt yra “parse” metodas. “Date.parse(str)” keiskite į “str.to_date”. Tiesa, šitas galioja tik ten, kur requirintas “active_support” gemsas (to_date metodas), tačiau jeigu rašote ne Rails aplikaciją, rekomenduoju iš jų pasiskolinti šitą String extesioną.Argumentai?

require 'rubygems'require 'benchmark'require 'active_support'n = 10_000Benchmark.bm do |x|  x.report("Date parse:") do    n.times do      Date.parse("2000-01-01")    end  end  x.report("Alternative parse:") do    n.times do      "2000-01-01".to_date    end  endend

Linux Mint, ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux] @ Intel(R) Pentium(R) 4 CPU 2.66GHz:

$ ruby date_parse_benchmark.rb                     user     system      total        realDate parse:          5.560000   0.590000   6.150000 (  6.379308)Alternative parse:  2.880000   0.240000   3.120000 (  3.158638)

Dukart!Ir dar: argumentas eiti link Ruby 1.9 (ruby 1.9.1 p378 w rvm):

$ ruby date_parse_benchmark.rb                      user     system      total        realDate parse:           2.630000   0.070000   2.700000 (  2.755911)Alternative parse:  1.480000   0.010000   1.490000 (  1.498565)

Taigi jei taip nutiktų, kad pabėgtumėt iš Date.parse su ruby 1.8.7 į to_date su 1.9.1, šioje vietoje paspartėsite ~4-5 kartus!

4 thoughts on “Venkite Date (Date vs Time battle)

  1. Edvinas

    Dar vienas sprendimas – date-performance gem’sas, kuris turi Date klasės implementaciją C kodu.

    Reply
  2. Vidmantas

    Dėkui, nežinojau tokio :-) Mestelėjau benchmarką su juo parse metodui, su 1.8.7 ruby real time’as ~4.9, tad tikrai geriau, bet nelenkia active_support’o to_date. Tarp kitko, ir pats to_date paspartėjo:<pre>$ ruby date_parse_benchmark.rb user system total realDate parse: 4.400000 0.480000 4.880000 ( 4.920749)Alternative parse: 2.100000 0.120000 2.220000 ( 2.258179)</pre>Nice, ačiū :-) Deja nesikompiliuoja prie 1.9.1…

    Reply
  3. Edvinas

    Aha. 1.9.1 supporto nėra :( Tikiuosi, kad greitai bus :)Stebiuos, kad active_support’as greitesnis. Įdomu kas ten per implementacija :)

    Reply
  4. medwezys

    Čia tiks spėjimas, bet gal ne implementacija gudri, o tiesiog objekto struktūra kita. Time užtenka saugoti sekundes nuo didžiojo skaičiavimo pradžios, o Date ko gero saugo hash’us su savaitės dienomis, mėnesiais ir pan.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *