【问题标题】:Why Dapper faster than Dapper plus?为什么 Dapper 比 Dapper plus 快?
【发布时间】:2020-04-23 23:31:01
【问题描述】:

给定一个简单的测试:

使用 Dapper:

for (int i = 0; i < 10000; i++)
{
      Connection.Execute("UPDATE User SET Name = 'Max'");
}

此操作的持续时间如下以StopWatch 衡量:

运行时间 00:00:37.51 持续时间:00:00:37.5150734 持续时间(以 Milli 为单位) 秒:37515

使用 Dapper plus:

User user = new User();
user.Name = "Max";
DapperPlusManager.Entity<User>().Table("User");
for (int i = 0; i < 10000; i++)
{
       Connection.BulkUpdate(user);
}

此操作的持续时间如下以StopWatch 衡量:

运行时间 00:00:39.85 持续时间:00:00:39.8553959 持续时间(以 Milli 为单位) 秒:39855

我在不同的场景下做了这个测试,Dapper 总是比 Dapper plus 快

问题很明确,为什么 Dapper 比 Dapper Plus 快?什么会导致这样的事情?

注意:我正在使用带有实体框架的 Sqlite

【问题讨论】:

标签: c# performance dapper dapper-plus


【解决方案1】:

为什么 Dapper 比 Dapper Plus 更快?什么会导致这样的事情?

a) BulkUpdate,顾名思义,用于批量更新(即一次更新多行)。你一次一个地调用它。你想给它打一个single,而不是10,000,以获得好处。

b) 后一个代码可能需要以前一个代码不需要的方式进行反射(例如,意识到存在Name 属性)。这会产生一些性能成本。

修复 a) 几乎肯定是您需要做的。 另外,使用更有意义的测试来更新 10,000 个不同的行 - 不是同一行 10,000 次(因为使用您当前的代码,最简单的解决方法是让它只执行一次而不是 10,000 次 - 但我怀疑这是不是你想要的)。

【讨论】:

  • 好的,谢谢。您所说的“后一个代码可能需要以前一个代码不需要的方式进行反射”到底是什么意思?
  • User user = new User(); user.Name = "Max"; DapperPlusManager.Entity&lt;User&gt;().Table("User"); 它可能需要反射来生成 SQL。例如意识到那里有一个Name 属性。以前的代码不需要这样做 - 它只是说“执行这个确切的 SQL”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
相关资源
最近更新 更多