我正在尝试用C#、.NET和Mono编写用于游戏的优化代码。(是的,我有使用C#而不是C++的正当理由)。
我注意到C#似乎没有正确地优化它的操作符。运算符运行的速度是手动运行的两倍,用Vector4数学在代码中插入。下面是我在.NET 4.5中运行了9999999次的一些简单的基准测试:
// Test 1
for (uint i = 0; i != 9999999; ++i)// 230 MS
{
vector += vector2;
vector2 -= vector;
}
// Test 2
for (uint i = 0; i != 9999999; ++i)// 185 MS
{
vector = vector.Add(ref vector2);
vector2 = vector2.Sub(ref vector);
}
// Test 3
for (uint i = 0; i != 9999999; ++i)// 116 MS
{
vector.X += vector2.X;
vector.Y += vector2.Y;
vector.Z += vector2.Z;
vector.W += vector2.W;
vector2.X -= vector1.X;
vector2.Y -= vector1.Y;
vector2.Z -= vector1.Z;
vector2.W -= vector1.W;
}
// EDIT Test 1 SOLVED ----------------------------------
// When the Operators are created like so, they actually perform the BEST!
// Sry MS for complaining :(... Although SIMD support would be nice :)
struct Vector4
{
public static Vector4 operator +(Vector4 p1, Vector4 p2)
{
p1.X += p2.X;
p1.Y += p2.Y;
p1.Z += p2.Z;
p1.W += p2.W;
return p1;
}
public static Vector4 operator -(Vector4 p1, Vector4 p2)
{
p1.X -= p2.X;
p1.Y -= p2.Y;
p1.Z -= p2.Z;
p1.W -= p2.W;
return p1;
}
}
for (uint i = 0; i != 9999999; ++i)// 75 MS
{
vector += vector2;
vector2 -= vector;
}我想知道是否有任何.NET IL优化工具?我看过了,但还没有找到真正的东西。或者更清楚地说,无论如何,为了性能优化我的C#代码或IL代码。
我真的很希望看到操作者至少表演185毫秒。这也只对它有意义。
这里是一个用于测试的im应用程序的链接: 下载
发布于 2012-10-01 18:29:38
您自己的回答和注释都给出了为什么调用.Add比使用加法运算符更快的强烈提示。
+的语义是操作数未被打开。做1 +2之后,你不会想到1的值是3,对吗?因此,为了遵循最小惊喜规则,各种实现中的加法操作符都遵循这个语义。
这也意味着vector4的加法运算符需要创建一个新的Vector4对象。这个新对象的内存可能已经被分配了(例如堆栈),但是这并没有多大帮助,因为当它被分配给分配给任何返回类型时,我们将不得不复制这个值。
Add实例方法的语义与加法运算符不同。它会变异其中一个实例,因此不需要创建新对象。
您发布的答案中加法运算符的语义与add的语义相等。
发布于 2012-10-01 18:16:22
我找到了解决问题的办法..。尽管我仍然希望了解有关.NET IL优化器的任何信息。另外,我们还想知道为什么使用运算符实际上比手动倾斜代码要快呢?
要在Vector4操作符上获得.NET的最佳性能,请执行以下操作:
public static Vector4 operator +(Vector4 p1, Vector4 p2)
{
p1.X += p2.X;
p1.Y += p2.Y;
p1.Z += p2.Z;
p1.W += p2.W;
return p1;
}
public static Vector4 operator -(Vector4 p1, Vector4 p2)
{
p1.X -= p2.X;
p1.Y -= p2.Y;
p1.Z -= p2.Z;
p1.W -= p2.W;
return p1;
}DONT DO:
public static Vector4 operator +(Vector4 p1, Vector4 p2)
{
return new Vector4(p1.X+p2.X, p1.Y+p2.Y, p1.Z+p2.Z, p1.W+p2.W);
}
//ect...https://stackoverflow.com/questions/12677684
复制相似问题