オブジェクトの動きで波の動きや円の動きをさせる際に三角関数(cos,sin,tan)を用いて表現します。
今回は、三角関数の動作速度の計測を行います
 
その際、Javaでは基本的にはjava.lang.Mathクラスを使用する思います。このMathクラスで、Math.cos()やMath.sin()で三角関数を使用することができます。
このsin,cosの実装はおそらくマクローリン展開で近似式として表現されていると思われます。マクローリン展開についてはここでは説明をしません。
このマクローリン展開による近似式実は意外と計算コストがかかると思われます。
そこで、三角関数の値をデータとして保持しておき、それを使用することでMathクラスの多用を避ける方法とMathクラスを三角関数を使用するたびに呼び出す方法の2つの方法を比較してみたいと思います。

 ・実行環境
  • IDE:IntelliJ IDEA
  •  Java 1.8
  • JUnit4
import org.junit.Test;
public class MathSpeedTest {
    int trialCount = 10000;
    int angle =360;

    @Test
    public void TrigonometricUse() throws Exception {
        double start = System.currentTimeMillis();
        for (int k = 0; k < trialCount; k++) {
            for (int i = 0; i < angle; i++) {
                Math.cos(Math.toRadians(i));
            }
        }
        System.out.println(start - System.currentTimeMillis());
    }

    @Test
    public void MemoryUse() throws Exception {
        double start = System.currentTimeMillis();
        float x[] = new float[angle];
        for (int i = 0; i < x.length; i++) {
            x[i] = (float) Math.cos(Math.toRadians(i));
        }

        for (int i = 0; i < trialCount; i++) {
            for (int j = 0; j < x.length; j++) {
                x[j] = x[j] + x[j];
            }
        }
        System.out.println(start - System.currentTimeMillis());
    }

}
 TrigonometricUse で逐次関数使用、MemoryUseでcosデータを保存して使用
MemoryUseではfor分の中身でやることがないため足しときました。

今回は、実行回数が10000回0~360度までのcosの値を生成。その結果の実行速度を計測

実行結果:
TrigonometricUse:315ms
MemoryUse:10ms

結果を見ると明らかMathクラスは実行コストがかかることがわかります。
ですが、MemoryUseでもデメリットがあり、より細かい角度(ラジアン)で三角関数が必要なときなどはデータ量が大きくなるため、メモリを逼迫するかもしれません。
ですが、画面上に表示するための円情報や波の生成などで使用する場合などの精度が必要とされないゲームで使用すると動作速度の向上が見込まれると思われます。