java - BigDecimal.valueOf( double d ) 的性能

标签 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 ).stripTrailingZeros();

这用于生成用于测试的随机信息。它的运行速度似乎比我预期的要慢,我发现慢的部分是 BigDecimal.valueOf( consumption ),这是因为 Double.toString()正在内部发生的调用。

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

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

最佳答案

您可以创建一个移位两位的 int 值,即 1234 表示 12.34,然后在创建 BigDecimal 时设置比例,而不是计算要四舍五入到两位小数的 double 值。即除以 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

关于java - BigDecimal.valueOf( double d ) 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6842599/

相关文章:

java - 如何使用谷歌云连接服务器发送上游 GCM 消息

sql - T/SQL 效率和执行顺序

floating-point - double 型的符合 IEEE 754 标准的 sqrt() 实现

将带有负数的 Float 转换为 Int32 失败,C

java - Intellij IDEA 9 : How can I disable the highlighting of errors in HTML files?

java - Java 新手 : what are the bits between i and j in 10000000000

java - 列出Java9中所有必需的模块?

java - 如何优化activemq

MySQL SUM 查询速度极慢

将 double 值转换为 uint_8 类型数组