Optimizavau Ruby

Visgi nesinorėjo tikėti, kad Ruby toks lėtas, todėl pasiskaičiau manualą. Pirma, susitvarkiau su tuo nil. Pasirodo, užteko nurodyt reikšmę pagal nutylėjimą (hmmm… įdomu tokie bajeriai kitose kalbose iš vis yra?). Paskui ir patį kodą perrašiau truputį panašiau į Ruby kodą ;) Rezultatas aiškus: kodas sutrumpėjo iki kokių 6 eilučių (atkaklios rungtynės su Perlu ;), o kodo greitis padidėjo penkis (!) kartus. Tiesa, algoritmas šiek tiek pasikeitė. Reikės tuo pačiu algoritmu ant PHP ką nors pabandyt. O juk atrodytų skaityt iš bylos po baitą yra labai lėta…

t = "%10.5f" % Time.now.to_f
h = {}; h.default=0;
File.new($*[0]).each_byte { |char| h[char] += 1 }
h.each { |k, v| print "#{k.chr} => #{v}\n" }
print "Laikas: ", (("%10.5f" % Time.now.to_f).to_f - t.to_f).to_s

Vykdymo greitis su 1.5MB tekstine byla: 12.708 sekundės (Perlas – 13.690)

2 Comments

  1. Na, mano kompe dabar pagal 2MB failo dorojimą Ruby ir PHP

    dalinasi 1,2 vietą ~(7,45sek), Perl atsilieka 1 sek.

  2. Tai dėl algoritmo skirtumo. Nes tiek PHP, tiek Ruby kodas failą vienu smūgiu nusiskaito, o perlas po eilutę.

    Kaip sakiau reikia bandyt

    undef $/; $_{$_}++ for split //, <>;

    print "$_ => $_{$_}\n" for keys %_;

Comments are closed.