应该缓存三角函数吗?

时间:2016-09-11 18:23:19

标签: java caching compiler-optimization jit

Math.sin()Math.cos()等功能有多广泛? 如果连续多次调用具有相同参数的方法,编译器是否会优化代码?如果没有,那么在这些方法的调用中你应该开始在变量中缓存结果吗?

2 个答案:

答案 0 :(得分:1)

三角函数通常实现为泰勒展开。他们很快。你可以自己编写并进行比较。

public class Main{
    private static double factorial(double n) {
        if (n <= 1) // base case
            return 1;
        else
            return n * factorial(n - 1);
    }
    private static double sin(int n) {
        int PRECISION = 10;
        double rad = n*1./180.*Math.PI;
        double sum = rad;
        for (int i = 1; i <= PRECISION; i++) {
            if (i % 2 == 0)
                sum += Math.pow(rad, 2*i+1) / factorial(2 * i + 1);
            else
                sum -= Math.pow(rad, 2*i+1) / factorial(2 * i + 1);
        }
        return sum;
    }

    public static void main(String []args){
        System.out.println(sin(180));
        System.out.println(Math.sin(Math.PI));

        System.out.println(sin(90));
        System.out.println(Math.sin(Math.PI/2));

        System.out.println(sin(200));
        System.out.println(Math.sin(200*2*Math.PI/360));
    }
}

当然,您可以缓存值,但这些方法可能已经过优化。

答案 1 :(得分:1)

与所有性能问题一样,您应该编写基准测试并自行查找,因为答案取决于您的JVM,操作系统和硬件。可以肯定地说,Math.sin / cos在现代PC和服务器硬件上需要几百纳秒 - 而不是从主内存加载一些东西 - 所以最好的方法就是尽可能地缓存。但总是在做出改变之前和之后进行衡量。