is_a?/ kind_of?与class.name在Ruby中进行类比较的性能差异

xdnvmnnf  于 2023-04-05  发布在  Ruby
关注(0)|答案(1)|浏览(93)

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

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

方法二:

a = '123'
a.kind_of? String

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

cnjp1d6j

cnjp1d6j1#

我认为is_a?是正确的。不是因为性能,而是因为正确性。
在你的应用中有多个String类是很好的,因此仅仅比较类名是不够的。.class.name == 'String'只返回类名为“String”的类,但它不会告诉你它是否是在当前上下文中调用String时返回的String类。
kind_of?不仅检查a是否是String的instance,如果aString的子类的instance,它还会返回true
你问了什么方法是最有效的,但没有告诉你如何在你的问题的上下文中定义有效。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?也是最快的。

相关问题