Por que é == mais rápido que o eql?
Eu li na documentação para a classe String queeql?
é um operador estrito de igualdade, sem conversão de tipo e==
é um operador de igualdade que tenta converter o segundo argumento em uma String, e o código-fonte C para este método confirma que:
oeql?
Código fonte:
<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>
o==
Código fonte:
<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>
Mas quando tentei comparar esses métodos, fiquei surpreso==
é mais rápido queeql?
até 20%! Meu código de referência é:
<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>
E resultados:
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>
Então, alguém pode explicar por que o mais simpleseql?
método é mais lento do que==
método no caso quando eu corri-lo por duas seqüências de caracteres semelhantes?