关于ZAKER 融媒体解决方案 合作 加入

c# – .NET IL ByteCode 优化器

CocoaChina 11-17

我正在尝试用 C#.NET 和 Mono 编写优化代码 , 用于游戏 . ( 是的 , 我有正当理由使用 C# 而不是 C ) .

我注意到 C# 似乎没有正确优化其运算符 . 与使用 Vector4 数学手动内联代码相比 , 运算符运行速度慢两倍 .

以下是我在 .NET 4.5 中运行 9999999 次的一些简单基准测试:

// Test 1for ( uint i = 0; i != 9999999; ++i ) // 230 MS{ vector += vector2; vector2 -= vector;}// Test 2for ( uint i = 0; i != 9999999; ++i ) // 185 MS{ vector = vector.Add ( ref vector2 ) ; vector2 = vector2.Sub ( ref vector ) ;}// Test 3for ( 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 毫秒的时间内完成任务 . 它也是有道理的 .

以下是用于测试的应用程序的链接:Download

最佳答案

你自己的答案和评论都强烈暗示为什么调用 .Add 比使用加法运算符更快 .

语义是操作数保持不变 . 做 1 2 你不会期望 1 之后的价值是 3 吗?因此 , 遵循最小惊喜的规则 , 各种实现中的加法运算符遵循该语义 .

这也意味着 vector4 的加法运算符需要创建一个新的 Vector4 对象 . 这个新对象的内存可能已经被分配 ( 例如堆栈 ) , 但这没有多大帮助 , 因为我们必须在分配给返回类型的任何值时复制该值 .

Add 实例方法的语义与加法运算符不同 . 它改变了其中一个实例 , 因此不必创建新对象 .

您发布的答案中的加法运算符的语义与添加的语义相同

以上内容由"CocoaChina"上传发布 查看原文
相关标签 c#

觉得文章不错,微信扫描分享好友

扫码分享