为什么表达式本身在方法参数中的存在使得C#中的方法变慢

Art*_*dod 0 c# performance lambda expression compiler-optimization

请考虑方法:

    private void FastMethod(string param)
    {
    }

    private void SlowMethod<T>(Expression<Func<T>> expression)
    {
    }
Run Code Online (Sandbox Code Playgroud)

并进行以下测试:

    [TestMethod]
    public void Test()
    {
        var stopwatch = new Stopwatch();
        stopwatch.Start();
        for (int i = 0; i < 1000000; i++)
        {
            this.FastMethod("TestContext");
        }

        TestContext.WriteLine("Fast time: " + stopwatch.ElapsedMilliseconds);
        stopwatch.Restart();

        for (int i = 0; i < 1000000; i++)
        {
            this.SlowMethod(() => this.TestContext);
        }

        TestContext.WriteLine("Slow time: " + stopwatch.ElapsedMilliseconds);
    }
Run Code Online (Sandbox Code Playgroud)

输出是:

快速时间:4

慢时间:2249

http://i.imgur.com/eYcBfZX.png

我知道这是每100万个电话,所以这看起来可能不是一个严重的性能问题.

但是我希望有一些基于属性设置器中的表达式的逻辑,它们将会经常调用+我只是好奇.

这里有优化空间吗?(我无法摆脱Expression方法参数,基本上我需要做一些语法树解析.有趣的是解析本身足够快).

Sri*_*vel 6

因为C#编译器代表您为每次迭代生成表达式树,所以调用该方法.它不是免费的.

如果你看看编译后的IL - 你可以看到幕后发生了什么.那里有很多分配.

您可以通过在循环外部初始化表达式树来确认这一点.

Expression<Func<TestContext>> parameter = () => this.TestContext;
for (int i = 0; i < 1000000; i++)
{
    this.SlowMethod(parameter);
}
Run Code Online (Sandbox Code Playgroud)

这输出:

Fast time: 3
Slow time: 3
Run Code Online (Sandbox Code Playgroud)