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)
Na, mano kompe dabar pagal 2MB failo dorojimą Ruby ir PHP
dalinasi 1,2 vietą ~(7,45sek), Perl atsilieka 1 sek.
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 %_;