繁体   English   中英

BigDecimal.valueOf(double d)的性能

[英]Performance of BigDecimal.valueOf( double d )

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

        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()调用而变慢了。

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

有什么办法可以改善此效果? 也许通过避免double-> BigDecimal转换。 我需要将结果设为BigDecimal,但是我不介意在此之前如何进行随机计算。

无需计算要四舍五入到小数点后两位的整数,您可以创建一个将两个值移位的int值,即1234代表12.34,然后在创建BigDecimal时设置小数位。 即除以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);

}

版画

The average time with BigDecimal.valueOf(double) was 557
The average time with BigDecimal.valueOf(long, int) was 18

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM