グラフィックアプリケーションでは、SharpDX.Matrix3x2
またはSystem.Numerics.Matrix3x2
のいずれかを使用して行列を表すことができます。しかし、両方のマトリックスをパフォーマンステストで実行すると、SharpDXの行列は手間をかけてSystem.Numerics.Matrix3x2
を時間の点で最大70%のマージンで打ち負かすことが分かりました。私のテストは非常に単純な繰り返し乗算でしたが、コードは次のとおりです。Matrix3x2パフォーマンス
var times1 = new List<float>();
for (var i = 0; i < 100; i++)
{
var sw = Stopwatch.StartNew();
var mat = SharpDX.Matrix3x2.Identity;
for (var j = 0; j < 10000; j++)
mat *= SharpDX.Matrix3x2.Rotation(13);
sw.Stop();
times1.Add(sw.ElapsedTicks);
}
var times2 = new List<float>();
for (var i = 0; i < 100; i++)
{
var sw = Stopwatch.StartNew();
var mat = System.Numerics.Matrix3x2.Identity;
for (var j = 0; j < 10000; j++)
mat *= System.Numerics.Matrix3x2.CreateRotation(13);
sw.Stop();
times2.Add(sw.ElapsedTicks);
}
TestContext.WriteLine($"SharpDX: {times1.Average()}\nSystem.Numerics: {times2.Average()}");
これらのテストは、Intel i5-6200Uプロセッサで実行しました。
ここで、私の質問は、SharpDXの行列がどのように高速化できるかです。 System.Numerics.Matrix3x2
はSIMD命令を高速に実行することはできませんか?
SharpDX.Matrix3x2
の実装はhereです。ご覧のとおり、これはプレーンなC#で書かれています。
_ "System.Numerics.Matrix3x2がSIMD命令を使用してより高速に実行されるはずはありませんか?" - [はい、ただし.NET 4.6 x64のみ](https://docs.microsoft.com/en-us)/dotnet/standard/numericics#simd-enabled-vector-types)を参照してください。 – MickyD
あなたのタイミングに欠陥がある可能性が高いです。正確な結果を得るには、[BenchmarkDotNet](https://github.com/dotnet/BenchmarkDotNet)のような標準的なベンチマークライブラリを使用してください。 – ja72