4

私は自分のためにプログラムを作っていますが、この質問が出てきました。このプログラムはグラフィックを扱うので、パフォーマンスを念頭に置く必要があります。

複数の変数を使用する場合、またはハードコードされたインデックスを持つ配列を使用する場合、パフォーマンスに違いはありますか?ある場合、どちらが良いですか?

説明する:

R = (X *  3.2406) + (Y * -1.5372) + (Z * -0.4986);
G = (X * -0.9689) + (Y *  1.8758) + (Z *  0.0415);
B = (X *  0.0557) + (Y * -0.2040) + (Z *  1.0570);

また

RGB[0] = (XYZ[0] *  3.2406) + (XYZ[1] * -1.5372) + (XYZ[2] * -0.4986);
RGB[1] = (XYZ[0] * -0.9689) + (XYZ[1] *  1.8758) + (XYZ[2] *  0.0415);
RGB[2] = (XYZ[0] *  0.0557) + (XYZ[1] * -0.2040) + (XYZ[2] *  1.0570);

前もって感謝します。

4

3 に答える 3

3

確かにメモリの違いがあります。

最初のシナリオでは、次を使用します(doubleを想定)。

8    8               8               8  = 24 bytes
R = (X *  3.2406) + (Y * -1.5372) + (Z * -0.4986);
8                                       = 32 bytes
G = (X * -0.9689) + (Y *  1.8758) + (Z *  0.0415);
8                                       = 40 bytes
B = (X *  0.0557) + (Y * -0.2040) + (Z *  1.0570);

2番目のシナリオは以下を使用します:

12 + 8    12 + 8               8                    8 = 56 bytes
RGB[0] = (XYZ[0] *  3.2406) + (XYZ[1] * -1.5372) + (XYZ[2] * -0.4986);
8                                                     = 64 bytes
RGB[1] = (XYZ[0] * -0.9689) + (XYZ[1] *  1.8758) + (XYZ[2] *  0.0415);
8                                                     = 72 bytes
RGB[2] = (XYZ[0] *  0.0557) + (XYZ[1] * -0.2040) + (XYZ[2] *  1.0570);

参照: http ://www.javamex.com/tutorials/memory/object_memory_usage.shtml

于 2012-12-06T17:22:18.887 に答える
3

ほとんどの場合、個別の変数を使用すると高速になります。

なんで?JVMは、実行時にコードを最適化して、コードを高速化します。各変数のフローと値を追跡して、コードを最適化する方法を学習します。たとえば、メソッドへのパラメータが割り当てられることはなく、したがって一定であることに気付く場合があります。ただし、配列の各要素に対してはそうしません。配列は、1つの巨大な可変変数と見なされます。したがって、個別の変数を使用すると、最適なコードが得られる可能性が高くなります。

于 2012-12-07T01:06:54.547 に答える
0

あなたはさらに一歩考える必要があります:

x、y、zの値はどこから来ますか?

座標用のx[]、y []、z []配列はありますか?どこで繰り返しますか?

for (int i = 0; i < len; i++) {
   process(x[i], y[i], z[i];
}

疑わしいことに、これは内部で反復する方が速いでしょう:

public void process(double x []、double y []、double z []){

   for (int i = 0; i < len; i++) {
       rbgb[0] = (x[i] * 3.24606 +  y[i] * 1.5372 + z[i] * -0.4986);

    }

}

于 2012-12-06T17:32:30.200 に答える