代码之家  ›  专栏  ›  技术社区  ›  Ján Яabčan

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

  •  -1
  • Ján Яabčan  · 技术社区  · 7 年前

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

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

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

    3 回复  |  直到 7 年前
        1
  •  6
  •   M. le Rutte    7 年前

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

    b ? 1d : 0d;

        2
  •  2
  •   Patricia Shanahan    7 年前

    引用代码花费大量时间的最可能原因是分支预测失误。任何时候,处理器必须处理一个条件分支,包括在三元运算符中,它必须猜测是否将执行该分支。如果它弄错了,它必须扔掉计算和管道内容,这可能会花费很多周期。

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

        3
  •  1
  •   Stephen C    7 年前

    依我看,你不太可能通过微观优化来提高它的性能。但您可以尝试:

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

    • 帕特里夏·沙纳汉的想法可能奏效;看见 https://stackoverflow.com/a/49837300/139985

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


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

    我建议您仔细研究您的基准测试方法。确保您的结果没有被JVM预热或GC的影响所扭曲 1.


    您发表了评论:

    我只需要将两个向量相乘。这些向量保存在特殊结构中。但我的这个问题很愚蠢。它工作得很好,速度也不错。用户似乎没有什么不同。但只有在有可能改进这个演员阵容的情况下,我才感兴趣。

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

    • 如果用户认为速度足够快 应该 要足够好。
    • 如果没有,则进行基准测试和概要分析,以便:
      1. 您可以决定这是否是您应该优化的代码库的一部分,
      2. 您可以衡量优化的效果。。。可靠,以及
      3. 你可以知道什么时候停止。

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