我有一个生成几个布尔值的工具,如下所示:
(!(dcn.XdbDate != null)) && (dcn.XdaDate != null)
最长的是1361个字符。我需要将这些文件复制到用于linq查询的C#源文件中。
我的问题是,C#会自动优化这些运算符吗?在上面的例子中,编译后会自动转换为下面的吗?
dcn.XdbDate == null && dcn.XdaDate != null
如果没有,是否有一些C#编译器功能,我可以编写程序,将其提供给非优化程序并获得优化程序?
编辑:
大多数生成的布尔运算都是
的形式xxx1 = condition ? value11 : value12,
xxx2 = condition ? value21 : value22,
etc...
问题在于condition
部分未经优化。
答案 0 :(得分:1)
这不是一个简单的答案..但无论如何我们都要尝试。
更多"泛型"方法你问如何知道什么是/将要优化什么不是? - 当然作为一个负责任的开发人员,你必须假设没有任何东西会为你优化,编写优化的代码完全由你负责。
话虽如此,我们当然知道有些事情会自动优化。
可以在3个不同的场合进行优化:
在构建Debug版本期间。
在发布版本的构建过程中。
在已构建的文件上执行NGEN实用程序。
优化可以被描述为洋葱 - 外壳将始终包含内壳,并将添加自己的东西。
所以,
调试中可以进行哪种类型的优化?
只有优化不会改变调试用户的代码分隔
例如:if(a==!true && a==false)
a==!true
与a==false
完全相同 - 因此只有其中一个是个好主意 - 但如果进行了这样的优化,开发人员就无法一步一步地在表达式之前优化 - 因此在调试版本中不会发生这种优化。
然而.. a==!true
- 只有这个自治部分可以替换为下面的a==false
而不会破坏表达式分离 - 这意味着从编译器的角度来看它可以替换: if(a==!true && a==false)
到一个可能更快的指令集,它实际上代表了if(a==false && a==false)
,因为表达式分离不会被命中,调试或插入不会改变。
发布时可以进行哪种优化?
如果我们回到相同的示例 - 在发布中 - 表达式if(a==!true && a==false)
可以优化为if(a==false)
,因为预定义版本不适用于调试,因此编译器在执行操作时无需担心这样的优化。
NGEN可以进行哪种优化?
这是一个完全不同的垂直...
NGEN可以用于调试或发布 - 意味着同样的规则同样适用,这实际上是由JIT在构建代码时完成的。 NGEN Job将优化它找到的本机(当前)机器CPU架构的代码。我不会在这里介绍它 - 你可以从here阅读所有相关信息。
请记住:如果表达式无法按照部分进行处理 - 它已经过优化。