4

我在一个用 Java 执行矩阵和向量运算的程序上工作。在我当前的实现中发生的多个函数调用和对象创建使它变得缓慢且难以理解。

例如,我想通过速度积分更新机械点的位置:

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

这里的 API 不太自然,另外我需要分配一个 build 一个新的 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 的《语言实现模式》一书。 他展示了如何基于 DSL 创建抽象语法树 (AST),然后使用重写规则生成代码。

此外,他使用向量 DSL 作为他的示例之一,包括展示如何在语法树中分布常数乘法。例如向量 DSL 的简化。 Terence Parr 的语言实现模式的第 141 页

与您相关的部分是第 15 章,树模式匹配器。

我同意其他一些海报,这对于您的目的来说可能有点重。您确定不能像@Alessandro Vermeulen 在他的要点评论中显示的那样实现更流畅的界面吗?速度差异看起来可以忽略不计。

于 2011-05-01T15:37:16.187 回答