Array # sort_by - , , Array # sort :
a.sort do |s1,s2|
t1 = (s1.is_a? Array) ? s1.first : s1
t2 = (s2.is_a? Array) ? s2.first : s2
t1 <=> t2
end.map {|e| (e.is_a? Array) ? e.join(', ') : e }
@theTinMan , sort , sort_by, , , . , Benchmark module, . @Rafa sort_by sort.
100 ( 10 000 , ), , ( ). 8 000 10000 8 . 2000 2- [str1, str2], str1 str2 8 . , .
require 'benchmark'
def make_samples(n, m, k, s)
s.times.with_object([]) { |_, a| a << test_array(n,m,k) }
end
def test_array(n,m,k)
a = ('a'..'z').to_a
r = []
(n-m).times { r << a.sample(k).join }
m.times { r << [a.sample(k).join, a.sample(k).join] }
r.shuffle!
end
make_samples(6,2,4,4)
n = 10000
m = 2000
k = 8
s = 100
samples = make_samples(n,m,k,s)
Benchmark.bm('sort_by'.size) do |bm|
bm.report 'sort_by' do
samples.each do |s|
s.sort_by { |f| f.class == Array ? f.first : f }
end
end
bm.report 'sort' do
samples.each do |s|
s.sort do |s1,s2|
t1 = (s1.is_a? Array) ? s1.first : s1
t2 = (s2.is_a? Array) ? s2.first : s2
t1 <=> t2
end
end
end
end
user system total real
sort_by 1.360000 0.000000 1.360000 ( 1.364781)
sort 4.050000 0.010000 4.060000 ( 4.057673)
, @theTinMan ! , sort_by sort .
, "" sort_by. sort. 0.010000, , . ( Mac.)
, Benchmark, Benchmark # bm , , ( user system...). bm.report .