C#会内联这些功能吗?

我正在用C#编写一个性能关键型应用程序,核心操作是权重计算.该函数如下所示:
public void ForEachWeight(Action<int,int,float> action)
{
    for (int lower = 0; lower < LowerLayerSize; lower++) {
        for (int upper = 0; upper < UpperLayerSize; upper++) {
            action(lower,upper,Weights[(lower * UpperLayerSize) + upper]);
        }
    }
}

它在几十个地方被调用,具有各种简单的功能,如:

if (activationMethod == ActivationMethod.Binary) {
    ForEachWeight((lower,weight) => upperLayer.Values[upper] += weight;
} else {
    ForEachWeight((lower,weight) => upperLayer.Values[upper] += lowerLayer.Values[lower] * weight);
}

所有调用都在同一个类中完成,因此所有变量都可以访问. C#可以内联这些函数调用吗?我在想,例如上面的调用可以内联到这样的东西:

if (activationMethod == ActivationMethod.Binary) {
    for (int lower = 0; lower < LowerLayerSize; lower++) {
        for (int upper = 0; upper < UpperLayerSize; upper++) {
            upperLayer.Values[upper] += weight;
        }
    }
} else {
    for (int lower = 0; lower < LowerLayerSize; lower++) {
        for (int upper = 0; upper < UpperLayerSize; upper++) {
            upperLayer.Values[upper] += lowerLayer.Values[lower] * weight);
        }
    }
}

如果不是,那就意味着成千上万的额外函数调用,我认为这是一个巨大的开销.如果这甚至可以提高10%的速度,那么它是完全值得的.我不能通过手动内联它们进行比较来轻松进行比较,因为我必须重写大量代码.

所以我的问题是CAN C#内联这些调用?如果是这样,我怎么能知道他们是否被内联?

解决方法

内联发生在JIT编译中,因此您需要在运行时检查代码以观察内联.这可以使用调试器来完成,但请记住,如果CLR检测到存在调试器,则会禁用各种优化,因此您需要在编译方法后附加调试器.

有关如何使用WinDbg / SOS查找方法的一些信息,请参阅these answers.

相关文章

文章浏览阅读6.2k次,点赞2次,收藏3次。C#数学运算表达式解...
文章浏览阅读5.2k次,点赞6次,收藏7次。程序要做到用户配置...
文章浏览阅读9k次。错误信息检测到 ContextSwitchDeadlock M...
文章浏览阅读2w次,点赞10次,收藏9次。我发生错误时的环境:...
文章浏览阅读9.8k次。C# 二进制字节流查找函数IndexOf ...
文章浏览阅读2.5w次,点赞3次,收藏9次。c#DataGridView数据...