4

Java で行列演算とベクトル演算を実行するプログラムに取り組んでいます。現在の実装で発生する複数の関数呼び出しとオブジェクト作成により、動作が遅くなり、理解しにくくなっています。

たとえば、速度積分によって機械点の位置を更新したいとします。

void update(Vector3 position, Vector3 speed, float dt){
   Vector3 displacement = new Vector3(speed);
   displacement.assignMul(dt);
   position.assignAdd(displacement);
}

ここでは、API が自然ではありません。さらに、ビルドに新しい Vector3 参照を割り当てる必要があります。明らかに、この方法で計算をインライン化すると、実際のユースケースで大幅なパフォーマンスの向上が測定されました。

void update(Vector3 position, Vector3 speed, float dt){
   position.x += speed.x * dt;
   position.y += speed.y * dt;
   position.z += speed.z * dt;
}

オンデマンドでドメイン固有言語からこのコードを生成できるツールはありますか? Cog のような構文がいいでしょう。(Cog は Ned Batchelder のコード生成ツールです)

void update(Vector3 position, Vector3 speed, float dt){
   // [[[DSL position += speed * dt ]]] 
   position.x += speed.x * dt;//Generated Code
   position.y += speed.y * dt;//Generated Code
   position.z += speed.z * dt;//Generated Code
   // [[[END]]]
}
4

1 に答える 1

1

コード生成に夢中なら、Terence Parr 著の『Language Implementation Patterns』という本を強くお勧めします。 彼は、DSL に基づいて抽象構文ツリー (AST) を作成し、書き換え規則を使用してコードを生成する方法を示しています。

さらに、彼はベクトル DSL を例の 1 つとして使用しており、構文ツリーで定数乗算を分散する方法を示しています。例えばベクター DSL の簡素化。 Terence Parrによる言語実装パターンの141ページ

関連するセクションは、第 15 章ツリー パターン マッチャーです。

これはあなたの目的には少し重いかもしれないという他のポスターのいくつかに同意します. @Alessandro Vermeulen が彼の要点コメントで示したように、より流暢なインターフェースを実装できないと確信していますか? 速度の違いはごくわずかに見えます。

于 2011-05-01T15:37:16.187 に答える