is_a之间的性能差异?/的种类?vsclass.name用于ruby中的类比较
我想知道哪种方法在比较两个类时更有效。
方法一:
a = '123'
a.class.name == 'String'
方法二:
a = '123'
a.kind_of? String
任何指针将不胜感激。谢谢!
回答
我认为is_a?是正确的。不是因为性能,而是因为正确性。
因为在您的应用程序中有多个 String 类是完全可以的,所以仅比较类名是不够的。.class.name == 'String'仅当类的名称为“String”时才返回,但它不会判断它是否与String您String在当前上下文中调用时将返回的类相同。
而kind_of?不仅检查是否a是String. true如果a是 的子类的实例,它也会返回String。
您询问了哪种方法最有效,但没有说明您如何在问题的上下文中定义有效。is_a?是最短的,我认为这是有效的。当你考虑性能时,看看这个:
require 'benchmark/ips'
string = "123"
Benchmark.ips do |x|
x.report("name == name") { string.class.name == "String" }
x.report("kind_of?") { string.kind_of?(String) }
x.report("is_a?") { string.is_a?(String) }
end
Warming up --------------------------------------
name == name 585.361k i/100ms
kind_of? 1.173M i/100ms
is_a? 1.299M i/100ms
Calculating -------------------------------------
name == name 5.870M (± 4.6%) i/s - 29.853M in 5.099899s
kind_of? 12.803M (± 3.0%) i/s - 64.514M in 5.043457s
is_a? 12.971M (± 3.6%) i/s - 64.935M in 5.012808s
THE END
二维码