C# 由于JIT_MethodAccessCheck,编译的表达式树速度较慢

C# 由于JIT_MethodAccessCheck,编译的表达式树速度较慢,c#,performance,expression-trees,C#,Performance,Expression Trees,我们使用编译后的表达式树动态生成代码;一些仅在运行时可用的信息使我们能够(理论上)编写更简单、更快的代码。 在许多情况下,我们确实获得了性能提升 然而,在某些情况下,我们会受到性能的影响。在这种情况下,VisualStudio探查器显示性能的差异是由于此方法造成的(在静态编译的代码中根本不显示此方法) 这个方法有什么作用?(谷歌对此没什么好说的)。 我能以某种方式优化它吗?JIT\u MethodAccessCheck方法执行安全检查,如@xanatos所述,以及类访问检查 类访问检查包括附加的

我们使用编译后的表达式树动态生成代码;一些仅在运行时可用的信息使我们能够(理论上)编写更简单、更快的代码。 在许多情况下,我们确实获得了性能提升

然而,在某些情况下,我们会受到性能的影响。在这种情况下,VisualStudio探查器显示性能的差异是由于此方法造成的(在静态编译的代码中根本不显示此方法)

这个方法有什么作用?(谷歌对此没什么好说的)。
我能以某种方式优化它吗?

JIT\u MethodAccessCheck
方法执行安全检查,如@xanatos所述,以及类访问检查

类访问检查包括附加的探查器旁路和。有关更多详细信息,请访问coreclr


由于coreclr与CLR兼容,我们可以安全地假设这两种方法中的检查方式相同。

使用此答案中的代码片段编译表达式树,它可以消除跨方法边界的检查:


这是一个抖动辅助函数,它会自动生成对它的调用,以验证沙箱限制。确切的细节是相当模糊的,您可以通过挖掘coreclr源代码来找到细节。优化代码最重要的细节是知道何时完成。如果此函数占主导地位,那么您可能做得太多了。@Hans这是可以由
[assembly:AllowPartiallyTrustedCallers][assembly:SecurityTransparent][assembly:SecurityRules(SecurityRuleSet.Level2,skipverificationfulltrust=true)]修复的“东西”
?@xanatos-后面的注释包括这些属性,因此,这可能值得一试。我还发现,尽管它指定了一种不同的clr方法,但它似乎与我的问题非常相似。@Hans所讨论的代码在软实时系统中对性能至关重要。分析表明,这一新通话需要10毫秒,即6%。不是很大,但也不是微不足道的。令人担忧的是,它是通过表达式树引入的——如果它一直存在,我怀疑我们会看到它。
JIT_MethodAccessCheck