在 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:
在性能上有什么区别吗?
提前致谢。
总结所有评论:
使用Integer.compare
的问题是API合约没有指定结果是-1、0或1。(这就是当前的实现returns,但它 可能会 在未来的版本中改变。)
Math.signum
采用 float
或 double
参数并且 return 是相同类型的结果。所以你需要在 switch
语句中进行类型转换(到 int
)。此外,转换和其他事情很可能会降低效率。
Integer.signum
效率更高和指定为return-1,0或1.
在这种情况下,if (x > 0) { ... } else if (x < 0) { ... } else { ... }
可能是最有效的。
如果你真的很在意,你可以编写一个微基准来测试上面的语句。
但是要小心过早优化的陷阱;即浪费时间在优化方法上,其中性能 实际上 对整体应用程序性能的影响很小。
假设我有一个 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
的问题是API合约没有指定结果是-1、0或1。(这就是当前的实现returns,但它 可能会 在未来的版本中改变。)Math.signum
采用float
或double
参数并且 return 是相同类型的结果。所以你需要在switch
语句中进行类型转换(到int
)。此外,转换和其他事情很可能会降低效率。Integer.signum
效率更高和指定为return-1,0或1.在这种情况下,
if (x > 0) { ... } else if (x < 0) { ... } else { ... }
可能是最有效的。
如果你真的很在意,你可以编写一个微基准来测试上面的语句。
但是要小心过早优化的陷阱;即浪费时间在优化方法上,其中性能 实际上 对整体应用程序性能的影响很小。