gpt4 book ai didi

c# - 烘焙方法是什么意思?

转载 作者:太空狗 更新时间:2023-10-29 20:08:17 25 4
gpt4 key购买 nike

我正在 micro ORM 上阅读这篇文章用在 SO 上。

作者展示了这个堆栈跟踪:

System.Reflection.Emit.DynamicMethod.CreateDelegate
System.Data.Linq.SqlClient.ObjectReaderCompiler.Compile
System.Data.Linq.SqlClient.SqlProvider.GetReaderFactory
System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Compile
System.Data.Linq.CommonDataServices+DeferredSourceFactory`1.ExecuteKeyQuery
System.Data.Linq.CommonDataServices+DeferredSourceFactory`1.Execute
System.Linq.Enumerable.SingleOrDefault
System.Data.Linq.EntityRef`1.get_Entity

然后说:

In the trace above you can see that 'EntityRef' is baking a method, which is not a problem, unless it is happening 100s of times a second.

有人可以解释堆栈跟踪与他所说的“烘焙方法”的含义以及为什么它会成为性能问题吗?

最佳答案

当你做类似的事情时:

int[] items = whatever;
IEnumerable<int> query = from item in items where item % 2 == 0 select item;

然后编译器将其转换成如下内容:

static bool Predicate(int item) { return item % 2 == 0; }
...
IEnumerable<int> query = Enumerable.Where<int>(items, new Func<int, bool> (Predicate));

也就是说,编译器为方法生成 IL。当您在运行时构建查询对象时,Where 返回的对象持有谓词的委托(delegate),并在必要时执行谓词。

但如果您愿意,可以在运行时为委托(delegate)构建 IL。您所做的是将谓词的主体持久化为一个表达式树。运行时表达式树可以动态编译成全新的IL;基本上我们启动了一个非常简化的编译器,它知道如何为表达式树生成 IL。这样您就可以在运行时更改谓词的详细信息并重新编译谓词,而无需重新编译整个程序。

该评论的作者使用“baking”作为“动态轻量级代码生成”的俚语。

关于c# - 烘焙方法是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9386606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com