Dapper / EF-当变量不在使用范围内时,为什么性能会提高

用户名

我使用相同的参数和存储的proc来运行以下两个查询。示例A耗时一分钟,而示例B耗时不到20秒。如果我使用EF调用相同的proc,那么我大约需要10秒钟(返回的记录刚超过50000)。因此,对于为什么EF更快也感到困惑。

范例A:

            List<resultObj> result;

            using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["string"].ConnectionString))
            {
                    result = conn.Query<resultObj>("spProc", param: new { /*params here*/ }, 
                    commandType: CommandType.StoredProcedure, commandTimeout: 300).ToList();
            }

范例B:

            using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["string"].ConnectionString))
            {
                var result = conn.Query<resultObj>("spProc", param: new { /*params here*/ }, 
                    commandType: CommandType.StoredProcedure, commandTimeout: 300).ToList();
            }

为什么将结果变量移出使用范围之外会导致性能大幅提高?

马克·格雷韦尔

没有理由是这种情况。在这种情况下,我怀疑是否有任何差异是由于数据库服务器瓶颈所致-也许您是在第一次有效地将数据预填充到内存中(速度较慢,必须将其击中磁盘)-或服务器争用或网络吞吐量问题。您在两个示例中描述的内容只能由基础数据源引起,而不是变量声明位置之间的差异。

略为注意:AsList()优于ToList(),但这也将:只会为您节省一小段时间(可能不到一毫秒)。

分析时,您应该:

  • 在没有连接IDE的发布模式下工作
  • 首先执行JIT并准备好所有外部源,通常在开始计时之前至少执行一次
  • 多次测量所有内容(在快速操作的情况下,进行数千次以获得平均值是很常见的-如果每次迭代需要30秒,显然不适用)
  • 提前强制执行GC等操作,以便任何其他GC都仅仅是被测试对象的错误
  • 尝试避免在测试机器/服务器/网络上出现竞争激烈的竞争

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

DAL中的存储库与服务模式:EF和Dapper

来自分类Dev

使用Dapper值对象

来自分类Dev

Dapper示例中的“#”是什么?

来自分类Dev

Dapper示例中的“#”是什么?

来自分类Dev

使用ODBC的Dapper WHERE IN语句

来自分类Dev

如何使用Dapper获取SqlDataReader?

来自分类Dev

如何使用Dapper进行FirstOrDefault()

来自分类Dev

使用Dapper.NET插入

来自分类Dev

使用Dapper映射嵌套对象

来自分类Dev

使用Dapper.NET插入

来自分类Dev

使用 SplitOn 的“MultiLevels”映射 Dapper

来自分类Dev

使用 Dapper 填充类对象

来自分类Dev

Dapper为什么打开查询而不执行

来自分类Dev

应用程序从EF4迁移到Dapper.net

来自分类Dev

应用程序从EF4迁移到Dapper.net

来自分类Dev

为什么“变量不在范围内”

来自分类Dev

Dapper对参数化查询的性能不佳

来自分类Dev

在Dapper中调用QueryAsync会引发InvalidOperationException

来自分类Dev

在Dapper中调用QueryAsync会引发InvalidOperationException

来自分类Dev

使用Dapper .Net使用范围标识批量插入多个关系表中

来自分类Dev

使用dapper的通用参数化sql查询

来自分类Dev

使用Dapper .NET执行多个存储过程

来自分类Dev

使用OleDb在Dapper中传递查询参数

来自分类Dev

使用Dapper ORM保留复杂对象

来自分类Dev

dapper是否应该使用“ using”语句?

来自分类Dev

Dapper-如何使用动态对象

来自分类Dev

使用dapper为ID创建约定

来自分类Dev

使用Dapper for .NET Core返回输出参数

来自分类Dev

使用Dapper进行多重映射查询