Почему == быстрее чем 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? метод медленнее, чем== метод в том случае, когда я запускаю его для двух одинаковых строк?

Ответы на вопрос(3)

Ваш ответ на вопрос