C# Matrix3x2性能
在我的图形应用程序中,我可以使用SharpDX.Matrix3x2或System.Numerics.Matrix3x2表示矩阵。然而,通过性能测试运行这两个矩阵后,我发现SharpDX的矩阵在时间上轻松击败System.Numerics.Matrix3x2,差距高达70%。我的测试是一个非常简单的重复乘法,下面是代码:C# Matrix3x2性能,c#,matrix,C#,Matrix,在我的图形应用程序中,我可以使用SharpDX.Matrix3x2或System.Numerics.Matrix3x2表示矩阵。然而,通过性能测试运行这两个矩阵后,我发现SharpDX的矩阵在时间上轻松击败System.Numerics.Matrix3x2,差距高达70%。我的测试是一个非常简单的重复乘法,下面是代码: var times1 = new List<float>(); for (var i = 0; i < 100; i++) { var sw = S
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()}");
我在英特尔i5-6200U处理器上运行了这些测试
现在,我的问题是,SharpDX的矩阵怎么可能更快?System.Numerics.Matrix3x2不应该使用SIMD指令来更快地执行吗
SharpDX.Matrix3x2的实现是可用的,正如您所看到的,它是用纯C编写的。结果证明我的测试逻辑有缺陷-我在循环中创建旋转矩阵,这意味着我在测试旋转矩阵和乘法的创建。我修改了测试代码,如下所示:
var times1 = new List<float>();
for (var i = 0; i < 100; i++)
{
var sw = Stopwatch.StartNew();
var mat = SharpDX.Matrix3x2.Identity;
var s = SharpDX.Matrix3x2.Scaling(13);
var r = SharpDX.Matrix3x2.Rotation(13);
var t = SharpDX.Matrix3x2.Translation(13, 13);
for (var j = 0; j < 10000; j++)
{
mat *= s;
mat *= r;
mat *= t;
}
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;
var s = System.Numerics.Matrix3x2.CreateScale(13);
var r = System.Numerics.Matrix3x2.CreateRotation(13);
var t = System.Numerics.Matrix3x2.CreateTranslation(13, 13);
for (var j = 0; j < 10000; j++)
{
mat *= s;
mat *= r;
mat *= t;
}
sw.Stop();
times2.Add(sw.ElapsedTicks);
}
当我在AnyCPU下检查环境iS64 BIT进程时,它返回false -并且VisualStudio中的首选32位框是灰色的,所以我怀疑AnyCPU在这种情况下只是X86的别名,这解释了为什么X64下测试的速度是2个数量级。这些只是旁注,不会影响你目前的成绩。我也做过类似的测试
Sharpdx中的一些对应函数是通过对象传递的,而不是通过引用传递的,您可能需要使用一些对应的通过引用传递的函数。您在测试中使用的运算符都很好,这是一个可比较的测试!。只是在某些情况下,运算符的使用比按参考函数慢。System.Numerics.Matrix3x2不是应该利用SIMD指令执行更快吗?-。你的时机很可能有问题。使用标准的基准库可以获得准确的结果。
Platform Target | System.Numerics.Matrix3x2 | SharpDX.Matrix3x2
---------------------------------------------------------------
AnyCPU | 168ms | 197ms
x64 | 1.40ms | 1.43ms