繁体   English   中英

性能更好的equal或instanceof是什么?

[英]what is more performant equal or instanceof?

执行者使用哪种方法?

等于:

public boolean hasSellByDate(Object item) {
  if ("Pear".equals(item.getClass().getSimpleName())) {
    return true;
  }
  return false;
}

的instanceof:

public boolean hasSellByDate(Object item) {
   if (item instanceof food.Pear) {
     return true;
   }
   return false;
 }

这两种方法有什么区别,每种情况都有哪些缺点?

第二个要好得多,因为第一个可以通过重构破坏,并且类型系统不会让您知道。

您还应该知道,第一种方法不适用于Pear子类(如果有)。 更糟糕的是,如果在不同的命名空间中有多个称为"Pear"类,可能会感到困惑。

至于性能,您将需要进行基准测试,但我希望第二个也会更快,因为instanceof是JVM上的单个操作码( https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings )。

我想将另外两个摘要添加到您的列表中。 因此,四个选项如下所示。

请注意,这四个选项在功能上都不同!

#1

public boolean hasSellByDate(Object item) {
  if ("Pear".equals(item.getClass().getSimpleName())) {
    return true;
  }
  return false;
}

#2

public boolean hasSellByDate(Object item) {
  if (item instanceof food.Pear) {
    return true;
  }
  return false;
}

#3

public boolean hasSellByDate(Object item) {
  if ("food.Pear".equals(item.getClass().getName())) {
    return true;
  }
  return false;
}   

#4

public boolean hasSellByDate(Object item) {
  if (item.class == food.Pear) {
    return true;
  }
  return false;
}

性能方面(至少在OpenJDK HotSpot JVM中):

  • #4是最快的
  • #2#3接近, #2可能在JIT编译之后最快
  • #1可能是真正的性能瓶颈,尤其是在多线程环境中

由于全局关键节和字符串操作, Class.getSimpleName()可能变得不合理而缓慢。 我已经看到它曾经是一个真正的性能瓶颈。 该方法用于格式化日志消息。

从风格上讲,我会根据功能需求推荐#2#4

再强调一次, 这四个选项在功能上都不同!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM