为什么通过一个包含对它的引用的结构访问类字段在C#中更快?

Ale*_*nin 6 .net c# performance

几天前,我查看了二叉树测试 @计算机语言基准游戏的C#实现,并且奇怪地惊讶:那里的树节点被描述为一个struct(TreeNode)引用一个class(Next),它有两个字段a 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();
}
Run Code Online (Sandbox Code Playgroud)

您可能会发现,它与原始实现非常相似.不过,这段代码的性能差了大约2.2倍!

有人可以解释为什么这种"优化"在.NET上有意义吗?我主要想了解这有什么其他含义 - 当然,如果它不仅仅是缺乏C#/ JIT编译器.

可以在这里找到相同代码的更易读的版本,只有一些小的性能改进:https://github.com/alexyakunin/BenchmarkGame-CSharp/blob/master/src/BinaryTrees/Program.cs

更新:我创建了一个额外的项目来对此进行基准测试: