Java 数学运算符的相对性能

标签 java performance optimization benchmarking

嗨,有人有关于 Java 数学运算符的相对性能/成本的引用吗?

理想情况下类似于《Code Complete 2》(我现在手头没有)

它可能看起来像这样:

  • 添加:1
  • 减法:2
  • 乘法:10
  • 除法:100
  • 对数:600
  • 指数:500

谢谢。

最佳答案

我编写了这个快速、非正式、完全不科学的测试代码:

import java.util.function.BinaryOperator;

public class Test {
    private static void test(String desc, BinaryOperator<Double> op, double a, double b, long startIter)
    {
        long maxIter = startIter;
        long elapsed;
        do {
            maxIter *= 2;
            long start = System.currentTimeMillis();
            for (long niter = 0; niter < maxIter; ++niter) {
                double res = op.apply(a, b);
            }
            elapsed = System.currentTimeMillis() - start;
        } while (elapsed <= 10_000);
        System.out.printf("%-15s/sec\t%g\n",
            desc, (maxIter * 1000.0) / elapsed);
    }

    public static void main(String[] arg)
    {
        test("Addition (double)", (Double a, Double b) -> {
            return a + b;
        }, 483902.7743, 42347.775, 10_000_000);
        test("Subtraction (double)", (Double a, Double b) -> {
            return a - b;
        }, 483902.7743, 42347.775, 10_000_000);
        test("Multiplication (double)", (Double a, Double b) -> {
            return a * b;
        }, 483902.7743, 42347.775, 1_000_000);
        test("Division (double)", (Double a, Double b) -> {
            return a / b;
        }, 483902.7743, 42347.775, 1_000_000);
        test("Log10", (Double a, Double b) -> {
            return Math.log10(a);
        }, 483902.7743, 42347.775, 1_000_000);
        test("LogE", (Double a, Double b) -> {
            return Math.log(a);
        }, 483902.7743, 42347.775, 1_000_000);
        test("Power", (Double a, Double b) -> {
            return Math.pow(a, b);
        }, 483902.7743, 12, 100_000);
    }
}

在我的环境中——标准 Java 8 JDK、Intel Core2 Quad Q8300 @ 2.5GHz——此测试的代表性原始输出是:

Addition (double)/sec   6.18619e+08
Subtraction (double)/sec    4.10651e+08
Multiplication (double)/sec 3.27010e+07
Division (double)/sec   3.22215e+07
Log10          /sec 1.99330e+07
LogE           /sec 1.99206e+07
Power          /sec 8.67870e+06

转换为相对性能我们有:

Addition          1.0
Subtraction       1.5
Multiplication   18.9
Division         19.2
Log10            31.0
LogE             31.1
Power            71.3

与往常一样,您的里程可能会有所不同。

关于Java 数学运算符的相对性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45829516/

相关文章:

java - WordSearch 类的 boolean 问题

java - 如何递归执行插入排序

Java编程任务效率

MySQL加入慢查询

python - 优化求解时返回函数调用和其他信息

Java单独的方法来查找素数

java - 通过 HttpURLConnection POST JSON 数据时出现 HTTP 错误 400 错误请求

java - 将 ByteBuffer 分配一个位置是否存在性能问题?

mysql - 在同一mysql查询中选择特定列和*

c++ - 如果从未调用函数,编译器会在创建程序时忽略它吗?