1

私が取り組んでいるプログラムには、3要素の配列があり、すべての目的と目的で数学的なベクトルとして使用しています。

コードを書く過程で、Vector単純な算術オーバーロード(+, -, * /)を使用して自分のクラスをロールするだけで、次のようなステートメントを単純化できるようになりました。

// old:
for (int i = 0; i < 3; i++)
    r[i] = r1[i] - r2[i];

// new:
r = r1 - r2;

生成されたコードでは、どちらがほぼ同じである必要があります。しかし、もっと複雑なことになると、これは本当に私のパフォーマンスに大きな影響を与える可能性がありますか?私のコードにある1つの例はこれです:

手動で書かれたバージョン:

for (int j = 0; j < 3; j++)
{
    p.vel[j] = p.oldVel[j] + (p.oldAcc[j] + p.acc[j]) * dt2 + (p.oldJerk[j] - p.jerk[j]) * dt12;
    p.pos[j] = p.oldPos[j] + (p.oldVel[j] + p.vel[j]) * dt2 + (p.oldAcc[j] - p.acc[j]) * dt12;
}

Vector演算子のオーバーロードでクラスを使用する:

p.vel = p.oldVel + (p.oldAcc + p.acc) * dt2 + (p.oldJerk - p.jerk) * dt12;
p.pos = p.oldPos + (p.oldVel + p.vel) * dt2 + (p.oldAcc - p.acc) * dt12;

この種のコードは内部ループ内で実行されるため、速度を上げるためにコードを最適化しようとしています。これらのことにオーバーロードされた演算子を使用すると、パフォーマンスに影響しますか?私はn個の相互重力体のシステムの数値積分を行っています。これらのベクトル演算は非常に一般的であるため、これを高速に実行することが重要です。

私が知らないイディオムやトリックと同様に、どんな洞察もいただければ幸いです。

4

3 に答える 3

2

逆に見たいと思います。Vectorクラスから始めて、パフォーマンスの問題が発生した場合は、手動で計算をインライン化する方が速いかどうかを確認できます。

パフォーマンスとは別に、計算は正確でなければならないことにも言及します。クラスにベクトル固有の計算があるということは、それらを個別にテストするのが簡単であり、クラスを使用するコードが短くなり、保守が容易になることを意味します。

于 2010-04-22T06:17:35.630 に答える
2

操作がコンパイラによってインライン化および最適化されている場合、通常、コードを適切に記述する(演算子を使用して読み取り可能で保守しやすくする)ことと、すべてを手動でインライン化することの違いはわかりません。

手動でインライン化すると、十分にテストされた1つのコードを再利用せず、同じコードを何度も作成するため、バグのリスクも大幅に高まります。演算子を使用してコードを作成することをお勧めします。その後手動でインライン化してコードを複製し、2番目のバージョンを手動でインライン化することで、コードを高速化できることを証明できます。次に、コードの2つのバリアントを相互に実行して、(a)手動インライン化が効果的であること、および(b)読み取り可能コードと手動インライン化コードの両方で同じ結果が得られることを証明できます。

ただし、手動でインライン化を開始する前に、自分で質問に答える簡単な方法があります。両方の方法でいくつかの簡単なテストケースを作成し、数百万回の反復を実行して、どちらのアプローチがより速く実行されるかを確認します。これにより、何が起こっているのかについて多くのことを学び、ここで受け取る理論的な答えからは決して得られない、特定の実装とコンパイラーに対する明確な答えを得ることができます。

于 2010-04-22T06:04:16.747 に答える
1

ConCRTコードサンプルをチェックしてください

http://code.msdn.microsoft.com/concrtextras/Release/ProjectReleases.aspx?ReleaseId=4270

ベクトルタイプやテンプレートなどを使用して、このようなトリックを実行するカップル(NBodyサンプルを含む)があります。

于 2010-04-29T05:12:11.483 に答える