在 switch 语句中使用 Math.signum(x) 还是 Integer.compare(x, 0) 更好?

Is it better to use Math.signum(x) or Integer.compare(x, 0) in a switch statement?

假设我有一个 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: 在性能上有什么区别吗? 提前致谢。

总结所有评论:

  1. 使用Integer.compare的问题是API合约没有指定结果是-1、0或1。(这就是当前的实现returns,但它 可能会 在未来的版本中改变。)

  2. Math.signum 采用 floatdouble 参数并且 return 是相同类型的结果。所以你需要在 switch 语句中进行类型转换(到 int)。此外,转换和其他事情很可能会降低效率。

  3. Integer.signum效率更高指定为return-1,0或1.

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

如果你真的很在意,你可以编写一个微基准来测试上面的语句。

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