Я прочитал в документации для класса String, что eql?
является строгим оператором равенства, без преобразования типа, и ==
является оператором равенства, который пытается преобразовать второй его аргумент в 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);
}
Но когда я попытался сравнить эти методы, я был удивлен тем, что ==
быстрее, чем eql?
до 20%!
Мой контрольный код:
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
И результаты:
Ruby 1.9.3-p125:
26.420000 0.250000 26.670000 ( 26.820762)
21.520000 0.200000 21.720000 ( 21.843723)
Ruby 1.9.2-p290:
25.930000 0.280000 26.210000 ( 26.318998)
19.800000 0.130000 19.930000 ( 19.991929)
Итак, может ли кто-нибудь объяснить, почему более простой метод eql?
медленнее, чем метод ==
в том случае, когда я запускаю его для двух похожих строк?