我在String类的文档中读到,eql?
是一个严格的等值运算符,不进行类型转换,而==
是一个等值运算符,它尝试将其第二个参数转换为字符串,并且这些方法的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:
->Ruby 1.9.2-p290:
25.930000 0.280000 26.210000 ( 26.318998)
19.800000 0.130000 19.930000 ( 19.991929)
那么,有人可以解释一下为什么更简单的eql?
方法在我用它比较两个相似字符串时比==
方法慢吗?
==
和eql?
吗?最终,如果 C 代码正确的话,eql?
应该比==
更快。 - mliebelteql?
必须比==
更快或者至少不会更慢,但是我尝试过改变基准测试的顺序,结果还是一样。我没有尝试每次交换==
和eql?
,你能提供这种基准测试的示例吗? - sharipov_ru