is_a之间的性能差异?/的种类?vsclass.name用于ruby​​中的类比较

我想知道哪种方法在比较两个类时更有效。

方法一:

a = '123'
a.class.name == 'String'

方法二:

a = '123'
a.kind_of? String

任何指针将不胜感激。谢谢!

回答

我认为is_a?是正确的。不是因为性能,而是因为正确性。

因为在您的应用程序中有多个 String 类是完全可以的,所以仅比较类名是不够的。.class.name == 'String'仅当类的名称为“String”时才返回,但它不会判断它是否与StringString在当前上下文中调用时将返回的类相同。

kind_of?不仅检查是否aString. 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


以上是is_a之间的性能差异?/的种类?vsclass.name用于ruby​​中的类比较的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>