将布尔值转换为double的快速方法

时间:2018-04-14 20:34:01

标签: java casting boolean double

我需要在java中将double转换为boolean。它经常在我的应用程序中发生,它对应用程序的性能起着至关重要的作用。有没有办法如何重写这个方法更快?我需要使用双精度操作,因为精度是必要的,但不是保存双精度,我只保存布尔值(当数据只能是0或1时)。代码在这里:

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

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

3 个答案:

答案 0 :(得分:4)

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

b ? 1d : 0d;

答案 1 :(得分:1)

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

  • 您可以尝试使用三元运算符代替if ... else。 JIT编译器应该将两个表单视为相同,并为它们生成等效的本机代码。但它可能没有。

  • Patricia Shanahan的想法可行;见https://stackoverflow.com/a/49837300/139985

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

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

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

您评论道:

  

我只需要将两个向量相乘。这些向量保存在特殊结构中。但这个问题对我来说是愚蠢的。它工作得很好,速度也不错。用户似乎有些不同。但是,如果有可能改进这种铸造,我只会感兴趣。

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

  • 如果用户认为它足够快,足够好。
  • 如果他们没有,那么基准和配置文件,以便:
    1. 您可以决定这是否是您应该优化的代码库的一部分,
    2. 您可以可靠地衡量优化效果......
    3. 你可以知道什么时候停止。

1 - 当有人引用测量时间仅为几秒的数据时,总会存在这样的风险:这些数据代表一次性测量,而不是预热JVM中多次重复的平均值。

答案 2 :(得分:1)

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

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