【问题标题】:Can lambda expressions be optimized by the compiler?编译器可以优化 lambda 表达式吗?
【发布时间】:2011-11-23 17:54:50
【问题描述】:

编译器/运行时能否重新排序或内联表达式树?

如果我得到以下代码:

public static int SomeSimpleMethod(int x) {
    return x;
}

void Main() {
    Expression<Func<bool>> expr = () => SomeSimpleMethod(2) == 3;
}

expr 可以包含其他内容(在伪代码中)

Expression.Lambda
    Expression.Equals
         Expression.Call
             Expression.Constant
         Expression.Constant

编辑

我只是在解析表达式树以查找一些项目,例如方法调用的名称(“SomeSimpleMethod”)。 lambda 将永远不会被执行,所以我只想确保方法调用不会远离表达式树进行优化。

【问题讨论】:

  • 如何优化?尺寸?速度?屠宰的鸡数量?
  • @RitchMelton:虽然一般来说这是一件有道理的事情,但不合格的“优化”意味着“速度”是相当普遍的。
  • @Ritch Melton: number of toenails cut
  • @delnan - 我不同意你的说法。当被问到 SO 时,它通常意味着“我如何用更少的代码(由我输入)来做到这一点”
  • 我一方面怀疑即使是最被误导的速度追求者,另一方面,即使是最不成熟的 Knuth 引用者,也不会不同意,如果编译器生成的代码在运行时内存中更小,但对速度没有任何影响,它仍然可以算作优化。也就是说,我认为对于 any 优化来说,这个问题是公平的。 OP 想知道编译器在获得他们描述的输入时会做什么,一个好的答案就是告诉他们。

标签: c# optimization lambda


【解决方案1】:

编译器永远不会优化它。

【讨论】:

  • 表达式编译器呢?
  • @Oded:这是一个完全独立的问题。但是,我相当怀疑它是否会考虑其他方法。不过,JITter 可能会。另外,你的意思是编译器;没有表达式求值者
  • 正是我想要的。谢谢。不知道标准中有没有规定?
【解决方案2】:

编译器无法优化它,因为它不知道如何执行。通常(通常?)表达式实际上不是由 CLR 执行,而是由诸如 SQL 引擎之类的其他东西执行。由于其他执行引擎的语义可能与 C# 的语义不完全匹配,因此将表达式完全按照写入数据的方式进行翻译非常重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2016-07-21
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多