分析我的应用程序时,我发现了一个令人不快的事实,即键入 Upadte<>(和 Query<>)构建器会在每个请求上评估 lambda 表达式,这会消耗大量 CPU。您将获得几个百分比的 CPU,从漂亮和现代类型的 UpdateBuilder<> 切换为:
var u = Update<MyPerson>.Inc(e => e.Age, Age);
到旧的好的静态字符串:
var u = Update.Inc("Age", Age);
QueryBuilder<> 也存在同样的问题,它还在每个请求上评估表达式,并且白白浪费宝贵的 CPU 资源。
官方LINQ 驱动程序页面指出:
C# 编译器无论如何都会在内部将使用查询语法编写的所有查询转换为 lambda 语法,因此选择任何一种样式都没有性能优势或损失。
是的,如果您在两种 LINQ 语法之间进行选择,这是正确的。但是使用和不使用 LINQ 语法之间存在巨大的性能差异。开销取决于您的客户执行查询的频率。就我而言,差异超过30%!
我想知道有什么方法可以同时获得漂亮的类型化语法和性能吗?
就我们显然需要将动态参数传递给每个请求而言,构建器结果的简单缓存并不是一个答案。我们需要找到“预编译”CPU 昂贵部分(关于 lambda 表达式评估)但保留动态参数(例如数组索引)的方法。