我的目标是使用运算符重载来提高矢量计算的速度/性能。
说我有以下方法:
/// <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 ++程序中很常见。
无论如何,我想知道是否有办法通过运算符重载来提高向量操作的速度。
答案 0 :(得分:1)
你可能正在咆哮错误的树。如果您使用系统向量结构(而不是类)和alfway体面的现代运行时,那么运行时将优化它并使用SIMD指令 - 您无法击败它。 http://www.drdobbs.com/architecture-and-design/simd-enabled-vector-types-with-c/240168888使用非标准的vecrots已经使你显着进入&#34;慢如molass&#34;领土,没有办法绕过它。
在RyuJit运行时中添加了SIMD支持,它比通常从字节码获得的速度快。