【问题标题】:Is it better to use Math.signum(x) or Integer.compare(x, 0) in a switch statement?在 switch 语句中使用 Math.signum(x) 或 Integer.compare(x, 0) 更好吗?
【发布时间】:2019-11-25 04:22:07
【问题描述】:

假设我有一个 int x,我希望代码根据 x 的符号做不同的事情。如果我使用 switch 语句,使用 Integer.compare(x, 0) 还是 Math.signum(x) 更好(更快)?

switch (Integer.compare(x, 0)) {
case 1:
    // positive
    break;
case -1:
    // negative
    break;
case 0:
    // zero
    break;
}

对比

switch (Math.signum(x)) {
case 1:
    // positive
    break;
case -1:
    // negative
    break;
case 0:
    // zero
    break;
}

另外,使用case 0:default: 之间有什么性能差异吗? 提前致谢。

【问题讨论】:

  • Integer.compare 的合同保证答案是 -1、0 或 1。使用此选项后果自负。
  • 哦,有没有什么情况下它会返回其他东西?还是只是在 Java 的未来版本中发生变化?
  • 它可能会在未来的版本中改变。 Oracle 的最新 Java 8 版本返回 -1、0 或 1。我没有检查其他版本。但作为一般原则,您应该永远假设一个方法做了它的 Javadoc 没有说它做的事情。
  • 感谢您的建议,我会记住的。
  • 如果你追求速度,最好使用if (x > 0) { ... } else if (x < 0) { ... } else { ... }

标签: java int switch-statement compare sign


【解决方案1】:

总结所有的cmets:

  1. 使用 Integer.compare 的问题是 API 合约没有指定结果是 -1、0 或 1。(这是当前实现返回的结果,但它可以在未来的版本中进行更改。)

  2. Math.signum 接受 floatdouble 参数并返回相同类型的结果。所以你需要在switch 语句中进行类型转换(到int)。此外,转换和其他因素很可能会降低效率。

  3. Integer.signum 更高效并且指定返回 -1、0 或 1。

  4. 在这种情况下if (x > 0) { ... } else if (x < 0) { ... } else { ... } 可能是最有效的。

如果您真的很在意,您可以编写一个微基准测试来测试上述陈述。

但是要小心过早优化的陷阱;即浪费时间优化方法,而性能实际上对整体应用程序性能的影响很小。

【讨论】:

  • 哦,我什至不知道Integer.signum 存在,谢谢!已接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多