コードフラグメントの比較A:
struct Vector2(T) {
// ...
auto opCast(U)() {
return U(x, y);
}
void opOpAssign(string op)(Vector2 vector) {
mixin ("x" ~ op ~ "= vector.x;");
mixin ("y" ~ op ~ "= vector.y;");
}
}
void main() {
auto fVec = Vector2!float(1.5, 1.5);
auto dVec = Vector2!double(1.5, 1.5);
// Benchmark: Loop following 10 million times.
fVec += cast(Vector2!float) dVec;
dVec -= cast(Vector2!double) fVec;
}
Bと:
struct Vector2(T) {
// ...
void opOpAssign(string op, U)(Vector2!U vector) {
mixin ("x" ~ op ~ "= vector.x;");
mixin ("y" ~ op ~ "= vector.y;");
}
}
void main() {
auto fVec = Vector2!float(1.5, 1.5);
auto dVec = Vector2!double(1.5, 1.5);
// Benchmark: Same as A.
fVec += dVec;
dVec -= fVec;
}
私のベンチマーク(DMD、Win7)では、AはBよりも約50ms高速です。これが理由は何ですか?Aの方が速い場合はそれを使用したいのですが、何を試しても、Vector2!doubleを暗黙的にVector2!floatにキャストすることはできません。これらのタイプを暗黙的にキャストする方法について何かアイデアはありますか?それとも、暗黙のうちにキャストしてはいけない理由についての議論はありますか?
これらのコンパイラでこのベンチマークを実行するようにGDCとLDCを設定していますが、これがDMDのみの最適化の問題であるかどうかを誰かが知っていますか?