2016-09-11 23 views
3

Math.sin()Math.cos()などの機能はどれくらいの規模ですか? 複数の同じ引数を持つメソッドを連続して呼び出すと、コンパイラはコードを最適化しますか?そうでない場合は、これらのメソッドを何回呼び出すかによって、結果を変数にキャッシングする必要がありますか?三角関数をキャッシュする必要がありますか?

+0

あなたはJITにそれを心配させるべきです。 – Kayaman

答えて

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

要因要素の実行変数を保持することができます。これによりO(n^2)の問題を回避します(階乗自体はO(n)が書かれたとおりです)。これが行われた後、sinとcosはO(n)を実装できます。ここでnは精度です。 – abligh

+1

あなたはここで引数の削減を完全にスキップしました。 – harold

1

すべてのパフォーマンスに関する質問と同様に、回答はJVM、OS、およびハードウェアによって異なるため、ベンチマークを作成して自分で見つけてください。 Math.sin/cosは、メインメモリから何かをロードするよりも、現代のPCとサーバーのハードウェアで数百ナノ秒かかると言っても過言ではありません。しかし、変更を加える前と後で常に測定してください。

関連する問題