C# Matrix3x2性能

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

在我的图形应用程序中,我可以使用SharpDX.Matrix3x2或System.Numerics.Matrix3x2表示矩阵。然而,通过性能测试运行这两个矩阵后,我发现SharpDX的矩阵在时间上轻松击败System.Numerics.Matrix3x2,差距高达70%。我的测试是一个非常简单的重复乘法,下面是代码:

 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