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