Java BigDecimal.valueOf的性能(双d)

Java BigDecimal.valueOf的性能(双d),java,performance,floating-point,bigdecimal,value-of,Java,Performance,Floating Point,Bigdecimal,Value Of,我有一段代码需要重复计算以下内容 double consumption = minConsumption + ( Math.random() * ( ( maxConsumption - minConsumption ) + 1 ) ); currentReading = currentReading.add( BigDecimal.valueOf( consumption ) ).setScale( 2, RoundingMode.HALF_EVEN ).str

我有一段代码需要重复计算以下内容

        double consumption = minConsumption + ( Math.random() * ( ( maxConsumption - minConsumption ) + 1 ) );
        currentReading = currentReading.add( BigDecimal.valueOf( consumption ) ).setScale( 2, RoundingMode.HALF_EVEN ).stripTrailingZeros();
这用于生成用于测试的随机ish信息。它的运行速度似乎比我预期的要慢,我发现慢的部分是
BigDecimal.valueOf(consumption)
,这是因为内部发生了
Double.toString()
调用

总体要求是生成一个随机介于最小值和最大值之间的消耗值。然后将其添加到当前读数以获得新读数


我有什么办法可以提高这个系统的性能吗?也许可以通过避免double->BigDecimal转换。我需要将结果设置为BigDecimal,但我不介意在此之前如何进行随机计算。

不必计算要舍入到小数点后两位的双精度值,您可以创建一个整数值,该值移动两位,即1234表示12.34,然后在创建BigDecimal时设置小数位数。i、 e.除以100

double min = 100;
double max = 10000000;
{
    long start = 0;
    int runs = 1000000;
    for (int i = -10000; i < runs; i++) {
        if (i == 0)
            start = System.nanoTime();
        double consumption = min + (Math.random() * ((max - min) + 1));

        BigDecimal.valueOf(consumption).setScale(2, BigDecimal.ROUND_HALF_UP);
    }
    long time = System.nanoTime() - start;
    System.out.printf("The average time with BigDecimal.valueOf(double) was %,d%n", time / runs);
}
{
    long start = 0;
    int runs = 1000000;
    int min2 = (int) (min * 100);
    int range = (int) ((max - min) * 100);
    Random rand = new Random();
    for (int i = -10000; i < runs; i++) {
        if (i == 0)
            start = System.nanoTime();
        int rand100 = rand.nextInt(range) + min2;
        BigDecimal bd = BigDecimal.valueOf(rand100, 2);
    }
    long time = System.nanoTime() - start;
    System.out.printf("The average time with BigDecimal.valueOf(long, int) was %,d%n", time / runs);

}

你是说BigDecimal.valueOf(double)?是什么让你认为这是一个性能问题?你有什么数据吗?如果不是的话,我怀疑你犯了过早优化的错误。我已经运行过它并多次点击暂停。调试程序在Double.toString()代码中停止调用的90%时间。@彼得,你说得对,我是说Double。修好了,谢谢你,成功了。现在速度更快,没有明显的瓶颈。
The average time with BigDecimal.valueOf(double) was 557
The average time with BigDecimal.valueOf(long, int) was 18