Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 布尔值到双精度的快速转换方法_Java_Casting_Boolean_Double - Fatal编程技术网

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

Java 布尔值到双精度的快速转换方法,java,casting,boolean,double,Java,Casting,Boolean,Double,我需要在java中将double转换为boolean。这在我的应用程序中经常发生,对应用程序的性能有着至关重要的影响。有没有办法重写此方法以加快速度?我需要使用双精度运算,因为精度是必需的,但我只保存布尔值(当数据只能为0或1时),而不是保存双精度。代码如下: public static double booleanToDouble(boolean b) { if (b) { return 1; } return 0

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

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

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

尽管我无法想象这种情况,但您可以在任何地方使用三元运算符,而不是调用函数:


b?1d:0d

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

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

  • 帕特里夏·沙纳汉的想法可能会奏效;看

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


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

    我建议您仔细研究您的基准测试方法。确保您的结果不会被JVM预热或GC1的影响所扭曲


    你评论道:

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

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

    • 如果用户认为它足够快,那就足够了
    • 如果没有,则对其进行基准测试和配置,以便:
    • 您可以决定这是否是您应该优化的代码库的一部分
    • 您可以测量优化的效果。。。可靠地,以及
    • 你可以知道什么时候停止


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

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


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

    可能吗?这,
    “我需要使用双精度进行操作,因为精度是必需的”
    ,似乎是向后的。当我需要非常高的精度时,我通常会尽量避免双精度。
    它对应用程序的性能有着至关重要的影响
    ——我对此表示怀疑<代码>我需要使用双精度运算,因为精度是必需的,-您的其他数学计算将比简单的转换耗费更多的时间。只需确保对处理的每一组数据只进行一次转换。@Turing85:以财务计算为例,然后查看以下帖子:@HovercraftFullOfEels啊好的^^^^这是一种特殊情况,因为它涉及的小数位数有限。我以为你在胡说八道。任意小数位。有趣的想法。但存在一种风险,即您可能会将分支预测失败推到其他地方。您需要仔细分析调用此方法的上下文。@StephenC是的,数据实际存储和读取为数值类型而不是布尔类型非常重要。如果将其存储并读取为布尔值,则无论在何处将其转换为数字类型,都会出现分支预测问题。