我正在尝试编写优化的C# .NET和Mono代码,用于游戏开发。(是的,我有使用C#而不是C++的充分理由。)
我注意到C#似乎无法正确地优化其运算符。与使用Vector4数学手动内联代码相比,运算符的速度慢了一倍。
以下是我在.NET 4.5中进行的一些简单基准测试,重复9999999次:
我想知道是否有任何.NET IL优化工具?我已经搜索了,但还没有找到合适的。或者更清晰地说,有没有办法优化我的C#代码或IL代码以提高性能。
我真的希望看到运算符至少在185ms内执行。这是很有意义的。
这里是我用于测试的应用程序链接: 下载
我注意到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代码以提高性能。
我真的希望看到运算符至少在185ms内执行。这是很有意义的。
这里是我用于测试的应用程序链接: 下载
MethodImplOptions.AggressiveInlining
来鼓励内联。 - CodesInChaos