eql?
型変換なしの厳密な等値演算子で==
あり、2 番目の引数を文字列に変換しようとする等値演算子である String クラスのドキュメントを読みました。このメソッドの C ソース コードは、次のことを確認しています。
eql?
ソースコード:
static VALUE
rb_str_eql(VALUE str1, VALUE str2)
{
if (str1 == str2) return Qtrue;
if (TYPE(str2) != T_STRING) return Qfalse;
return str_eql(str1, str2);
}
==
ソースコード:
VALUE
rb_str_equal(VALUE str1, VALUE str2)
{
if (str1 == str2) return Qtrue;
if (TYPE(str2) != T_STRING) {
if (!rb_respond_to(str2, rb_intern("to_str"))) {
return Qfalse;
}
return rb_equal(str2, str1);
}
return str_eql(str1, str2);
}
しかし、これらの方法のベンチマークを試みたところ、最大 20%==
も高速であることに驚きました。eql?
私のベンチマークコードは次のとおりです。
require "benchmark"
RUN_COUNT = 100000000
first_string = "Woooooha"
second_string = "Woooooha"
time = Benchmark.measure do
RUN_COUNT.times do |i|
first_string.eql?(second_string)
end
end
puts time
time = Benchmark.measure do
RUN_COUNT.times do |i|
first_string == second_string
end
end
puts time
そして結果:
ルビー 1.9.3-p125:
26.420000 0.250000 26.670000 ( 26.820762)
21.520000 0.200000 21.720000 ( 21.843723)
ルビー 1.9.2-p290:
25.930000 0.280000 26.210000 ( 26.318998)
19.800000 0.130000 19.930000 ( 19.991929)
では、 2 つの同様の文字列に対して実行した場合に、より単純なeql?
メソッドがメソッドよりも遅い理由を誰か説明できますか?==