在C#中计算向量的性能考虑因素

时间:2017-05-31 06:10:58

标签: c#

我的目标是使用运算符重载来提高矢量计算的速度/性能。

说我有以下方法:

        /// <summary>
        /// Adds two vectors together and returns the result.
        /// </summary>
        /// <param name="vLeft">The left vector.</param>
        /// <param name="vRight">The right vector.</param>
        /// <returns>Returns the vector result.</returns>
        public static Vector2D operator +(Vector2D vLeft, Vector2D vRight)
        {
            Vector2D vResult = new Vector2D();

            vResult.m_x = vLeft.m_x + vRight.m_x;
            vResult.m_y = vLeft.m_y + vRight.m_y;

            return vResult;
        }

这实例化一个Vector2D类型的新对象,进行一些算术运算,然后返回结果。看起来很多东西都在继续,但为了提高速度,我使Vector2D成为一个结构而不是直接操作的类,因为它是一个值类型而不是引用。

我很想知道这种风格是否会在返回结果时获得更好的性能提升:

        public static Vector2D operator +(Vector2D vLeft, Vector2D vRight)
        {  
            return new Vector2D(vLeft.m_x + vRight.m_x, vLeft.m_y + vRight.m_y);
        }

虽然在价值类型的结构,这带来了另一个问题。返回的向量是二进制副本;但是,这在我过去使用过的C ++程序中很常见。

无论如何,我想知道是否有办法通过运算符重载来提高向量操作的速度。

1 个答案:

答案 0 :(得分:1)

你可能正在咆哮错误的树。如果您使用系统向量结构(而不​​是类)和alfway体面的现代运行时,那么运行时将优化它并使用SIMD指令 - 您无法击败它。 http://www.drdobbs.com/architecture-and-design/simd-enabled-vector-types-with-c/240168888使用非标准的vecrots已经使你显着进入&#34;慢如molass&#34;领土,没有办法绕过它。

在RyuJit运行时中添加了SIMD支持,它比通常从字节码获得的速度快。