বিভিন্ন প্রস্তাবিত উত্তরের একটি মানদণ্ড করা সর্বদা আলোকিত করা। আমি যা জানতে পেরেছি তা এখানে:
#! / Usr / bin / রুবি
'বেঞ্চমার্ক' প্রয়োজন
ary = []
1000.টাইমস {
ary << {: বার => র্যান্ড (1000)}
}
n = 500
বেঞ্চমার্ক.বিএম (20) কর | এক্স |
x.report ("সাজান") {n.টাইমস {ary.sort {| ক, খ | বি [: বার] <=> এ [: বার]}}}
x.report ("সাজানো বিপরীত") {n.টাইমস {ary.sort {| ক, খ | a [: বার] <=> খ [: বার]}। বিপরীত}
x.report ("সাজানো_বাইএ [বার:" ") {n.টাইমস {আরি.সোর্ট_বাই {| আ | -একটি বার] } } }
x.report ("সাজানো_এক [: বার] * - 1") {n.টাইমস {ary.sort_by {| a | a [: বার] * - 1}}}
x.report ("sort_by.revers!") {n.টাইমস {ary.sort_by {| a | একটি [: বার] re। বিপরীত}
শেষ
ব্যবহারকারী সিস্টেম মোট বাস্তব
বাছাই করুন 3.960000 0.010000 3.970000 (3.990886)
বাছাই করুন 4.040000 0.000000 4.040000 (4.038849)
সাজানো_বি -a [: বার] 0.690000 0.000000 0.690000 (0.692080)
বাছাই_এক [: বার] * - 1 0.700000 0.000000 0.700000 (0.699735)
sort_by.reverse! 0.650000 0.000000 0.650000 (0.654447)
আমি মনে করি এটি আকর্ষণীয় যে @ পাবলো sort_by{...}.reverse!
দ্রুততম। পরীক্ষা চালানোর আগে আমি ভেবেছিলাম এটি " -a[:bar]
" এর চেয়ে ধীর হবে তবে মানটিকে অগ্রাহ্য করার ফলে এটি একটি পাসে পুরো অ্যারেটিকে উল্টে যাওয়ার চেয়ে বেশি সময় নেয় to এটি খুব বেশি পার্থক্য নয়, তবে প্রতিটি সামান্য গতি বাড়িয়ে তোলে।
দয়া করে মনে রাখবেন যে রুবি ১.৯-এ এই ফলাফলগুলি পৃথক
রুবি 1.9.3p194 (2012-04-20 রিভিশন 35410) এর জন্য ফলাফল এখানে রয়েছে [x86_64-darwin10.8.0]:
user system total real
sort 1.340000 0.010000 1.350000 ( 1.346331)
sort reverse 1.300000 0.000000 1.300000 ( 1.310446)
sort_by -a[:bar] 0.430000 0.000000 0.430000 ( 0.429606)
sort_by a[:bar]*-1 0.420000 0.000000 0.420000 ( 0.414383)
sort_by.reverse! 0.400000 0.000000 0.400000 ( 0.401275)
এগুলি পুরানো ম্যাকবুক প্রোতে রয়েছে। আরও নতুন বা দ্রুত মেশিনগুলির মান কম হবে, তবে আপেক্ষিক পার্থক্য থাকবে।
এখানে নতুন হার্ডওয়্যারটির সামান্য আপডেট হওয়া সংস্করণ এবং রুবির ২.১.১ সংস্করণ রয়েছে:
#!/usr/bin/ruby
require 'benchmark'
puts "Running Ruby #{RUBY_VERSION}"
ary = []
1000.times {
ary << {:bar => rand(1000)}
}
n = 500
puts "n=#{n}"
Benchmark.bm(20) do |x|
x.report("sort") { n.times { ary.dup.sort{ |a,b| b[:bar] <=> a[:bar] } } }
x.report("sort reverse") { n.times { ary.dup.sort{ |a,b| a[:bar] <=> b[:bar] }.reverse } }
x.report("sort_by -a[:bar]") { n.times { ary.dup.sort_by{ |a| -a[:bar] } } }
x.report("sort_by a[:bar]*-1") { n.times { ary.dup.sort_by{ |a| a[:bar]*-1 } } }
x.report("sort_by.reverse") { n.times { ary.dup.sort_by{ |a| a[:bar] }.reverse } }
x.report("sort_by.reverse!") { n.times { ary.dup.sort_by{ |a| a[:bar] }.reverse! } }
end
# >> Running Ruby 2.1.1
# >> n=500
# >> user system total real
# >> sort 0.670000 0.000000 0.670000 ( 0.667754)
# >> sort reverse 0.650000 0.000000 0.650000 ( 0.655582)
# >> sort_by -a[:bar] 0.260000 0.010000 0.270000 ( 0.255919)
# >> sort_by a[:bar]*-1 0.250000 0.000000 0.250000 ( 0.258924)
# >> sort_by.reverse 0.250000 0.000000 0.250000 ( 0.245179)
# >> sort_by.reverse! 0.240000 0.000000 0.240000 ( 0.242340)
আরও সাম্প্রতিক ম্যাকবুক প্রোতে রুবি ২.২.১ ব্যবহার করে উপরের কোডটি চালিত নতুন ফলাফল। আবার, সঠিক সংখ্যাগুলি গুরুত্বপূর্ণ নয়, এটি তাদের সম্পর্ক:
Running Ruby 2.2.1
n=500
user system total real
sort 0.650000 0.000000 0.650000 ( 0.653191)
sort reverse 0.650000 0.000000 0.650000 ( 0.648761)
sort_by -a[:bar] 0.240000 0.010000 0.250000 ( 0.245193)
sort_by a[:bar]*-1 0.240000 0.000000 0.240000 ( 0.240541)
sort_by.reverse 0.230000 0.000000 0.230000 ( 0.228571)
sort_by.reverse! 0.230000 0.000000 0.230000 ( 0.230040)
মিড-2015 ম্যাকবুক প্রোতে রুবি 2.7.1 এর জন্য আপডেট হয়েছে:
Running Ruby 2.7.1
n=500
user system total real
sort 0.494707 0.003662 0.498369 ( 0.501064)
sort reverse 0.480181 0.005186 0.485367 ( 0.487972)
sort_by -a[:bar] 0.121521 0.003781 0.125302 ( 0.126557)
sort_by a[:bar]*-1 0.115097 0.003931 0.119028 ( 0.122991)
sort_by.reverse 0.110459 0.003414 0.113873 ( 0.114443)
sort_by.reverse! 0.108997 0.001631 0.110628 ( 0.111532)
... বিপরীত পদ্ধতিটি আসলে একটি বিপরীত অ্যারে ফিরিয়ে দেয় না - এটি এমন একটি গণক দেয় যা কেবল শেষে শুরু হয় এবং পিছনের দিকে কাজ করে।
এর উত্স Array#reverse
হ'ল:
static VALUE
rb_ary_reverse_m(VALUE ary)
{
long len = RARRAY_LEN(ary);
VALUE dup = rb_ary_new2(len);
if (len > 0) {
const VALUE *p1 = RARRAY_CONST_PTR_TRANSIENT(ary);
VALUE *p2 = (VALUE *)RARRAY_CONST_PTR_TRANSIENT(dup) + len - 1;
do *p2-- = *p1++; while (--len > 0);
}
ARY_SET_LEN(dup, RARRAY_LEN(ary));
return dup;
}
do *p2-- = *p1++; while (--len > 0);
আমি যদি আমার সি সঠিকভাবে মনে করি তবে অ্যারেটি বিপরীত হয় তাই বিপরীত ক্রমে উপাদানগুলিতে পয়েন্টারগুলি অনুলিপি করা হয়।