前几天我查看了Binary Trees test @计算机语言基准游戏的C#实现,并且非常惊讶:那里的树节点被描述为引用类的结构(TreeNode
)( Next
)有两个TreeNode
(strut)类型的字段。这显然看起来很奇怪,所以我更新了这段代码以使用单个类(即〜class TreeNode { TreeNode Left, Right }
)。我的ItemCheck
实施是:
public int ItemCheck()
{
if (ReferenceEquals(Left, null)) // Such a node is always a leaf in this test
return 1;
return 1 + Left.ItemCheck() + Right.ItemCheck();
}
您可能会发现,它与原始实施非常相似。不过,这段代码的性能差了大约2.2倍!
有人可以解释为什么这种"优化"在.NET上有意义吗?我主要想了解这有什么其他含义 - 当然,如果它不仅仅是缺少C#/ JIT编译器。
可以在此处找到相同代码的更具可读性的版本以及一些轻微的性能改进:https://github.com/alexyakunin/BenchmarkGame-CSharp/blob/master/src/BinaryTrees/Program.cs
更新:我创建了一个额外的项目来对此进行基准测试: