java - 测量 double 与 BigDecimal

标签 java double bigdecimal

我编写了简单的基准测试来测试 multyplying double 与 BigDecimal 的性能。我的方法正确吗?我使用随机值是因为编译器多次优化了乘法常量(例如 Math.PI * Math.E)。
但是:
- 我不知道在测试中生成随机数是否会破坏结果。
- 在测试中创建新的 BigDecimal 对象也是如此。

我只想测试乘法的性能(不是构造函数使用的时间)。

如何实现?

import java.math.*;
import java.util.*;

public class DoubleVsBigDecimal
{
    public static void main(String[] args)
    {
        Random rnd = new Random();
        long t1, t2, t3;
        double t;

        t1 = System.nanoTime();

        for(int i=0; i<1000000; i++)
        {
            double d1 = rnd.nextDouble();
            double d2 = rnd.nextDouble();
            t = d1 * d2;
        }

        t2 = System.nanoTime();

        for(int i=0; i<1000000; i++)
        {
            BigDecimal bd1 = BigDecimal.valueOf(rnd.nextDouble());
            BigDecimal bd2 = BigDecimal.valueOf(rnd.nextDouble());
            bd1.multiply(bd2);
        }

        t3 = System.nanoTime();

        System.out.println(String.format("%f",(t2-t1)/1e9));
        System.out.println(String.format("%f",(t3-t2)/1e9));
        System.out.println(String.format("%f",(double)(t3-t2)/(double)(t2-t1)));
    }
}

最佳答案

您不仅要为乘法运算计时,还要为其他事情计时。

你需要做类似的事情:

    long time = 0; 
    for(int i=0; i<1000000; i++) {
        double d1 = rnd.nextDouble();
        double d2 = rnd.nextDouble();
        long start = System.nanoTime();
        t = d1 * d2;
        long end = System.nanoTime();
        time += (end-start)
    }
    long meantime = time / 1000000;

然后也可能计算标准误差。此外,您可能需要在开始之前先通过一些计算来预热 jvm,否则您会在开始时获得一些高值。

关于java - 测量 double 与 BigDecimal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10708452/

相关文章:

java - jsp页面只显示字符串中的一个单词

java - SWT 中的 native 文件浏览器小部件

java - 使用流将多个 HashMap 的内容相加

Java BigDecimal - 需要解释

hadoop - 配置单元数据类型 : Double Precision & Scale

java - 添加 2 个 BigDecimal 值

java - 字符串的线性时间排序算法?

java - Android 程序因空指针异常而崩溃

java - Android Java百分比计算

java - 从字符串中提取 2 个不同的 double 值