将布尔值转换为双精度的快速方法



我需要在java中将双精度转换为布尔值。它在我的应用程序中经常发生,它对应用程序的性能具有至关重要的影响。有没有办法重写此方法以使其更快?我需要使用双精度运算,因为精度是必需的,但我不是保存双精度,而是只保存布尔值(当数据只能为 0 或 1 时)。代码在这里:

public static double booleanToDouble(boolean b) {
if (b) {
return 1;
}
return 0;
}

在我看来,这不是XY问题。应用程序整个运行 50 000 000 行数据需要 3 秒。通过这种转换,时间大约增长到 5 秒。因此,此转换需要两秒钟,它几乎是整个应用程序运行的一半。

虽然我无法想象用例,但您可以在任何地方使用三元运算符而不是调用函数:

b ? 1d : 0d;

引用代码花费大量时间的最可能原因是错误预测的分支。每当处理器必须处理条件分支时,包括在三元运算符中,它都必须猜测分支是否会被采用。如果弄错了,它必须扔掉计算和管道内容,这可能会花费许多周期。

请考虑将数据存储为字节而不是布尔值。转换将是简单的整数到双精度转换,没有分支。

IMO,您不太可能通过微优化来提高其性能。 但你可以试试:

  • 您可以尝试使用三元运算符而不是if...else. JIT 编译器应将这两种形式视为相同形式,并为它们生成等效的本机代码。 但未必。

  • 帕特里夏·沙纳汉(Patricia Shanahan)的想法可能可行;见 https://stackoverflow.com/a/49837300/139985

  • 此方法应足够小,以便 JIT 编译器在本机代码级别自动内联该方法。 但是,您可以通过将对方法的调用替换为方法的主体来手动内联代码。


似乎已经进行了一些测量,这是您决定需要优化这部分代码的基础。

我建议您仔细查看您的基准测试方法。 确保您的结果不会因 JVM 预热或 GC1的影响而失真。

  • 如何在 Java 中编写正确的微基准测试?
  • 避免 JVM 上的基准测试陷阱

你评论说:

我只需要将两个向量相乘。这些向量保存在特殊结构中。但是这个问题对我来说很愚蠢。它真的很好,速度还不错。用户似乎没有一些区别。但只有在有可能改进这种选角的情况下,我才感兴趣。

关于优化的标准建议是将精力花在实际需要的地方。 在这种情况下:

  • 如果用户认为它足够快,那应该足够好。
  • 如果没有,则进行基准测试和剖析,以便:
    1. 您可以决定这是否是您应该优化的代码库部分,
    2. 您可以衡量优化的效果...可靠,并且
    3. 您可以知道何时停止。

1 - 当有人引用测量时间只有几秒钟的数字时,始终存在这样的风险,即这些数字表示一次性测量,而不是预热 JVM 中多次重复的平均值。

最新更新