c# - 为什么 C# Ado.net 比 Entity Framework 6.1.3 慢?

标签 c# ado.net entity-framework-6

我编写了一些代码来比较 C# Ado.Net 和 Entity Framework 6.1.3 的性能。我正在调用一个存储过程,该过程返回大约 20,000 条员工记录,然后将这些数据映射到“Person”对象列表中。然后我运行了该代码 1000 次迭代并计算了平均时间。

时间安排如下:

  • Ado 网络:638 毫秒

  • Entity Framework :544 毫秒

令我惊讶的是,Ado Net 比 Entity Framework 慢大约 100 毫秒。

Ado.Net 代码:

    //GetAllPersons is a stored proc hosted in Local DB instance
    var adapter = new SqlDataAdapter("GetAllPersons", conn);
    adapter.Fill(dt);
    //Using Fast member library
    var accessor = TypeAccessor.Create(typeof(Person));
    MemberSet members = accessor.GetMembers();
    var list = new List<Person>();
    foreach(DataRow row in dt.Rows)
    {
        var person = new Person();
        foreach (var member in members)
        {
            if (row[member.Name] != DBNull.Value)
            {
                accessor[person, member.Name] = row[member.Name];
            }
        }
        list.Add(person);
    }

Entity Framework :

        var context = new AdventureWorks2012Entities1();
        List<Person> list = context.GetAllPersons().ToList();

使用 SQL Adatper 加载数据表的代码部分是花费最多时间的部分。我尝试使用 SQL Datareader,但结果更糟。我是否在这里遗漏了一些东西,因为据说普通的 Ado.Net 应该比 Entity Framework 更快?

最佳答案

您写道您尝试过 SqlDataReader,但速度更慢。它应该是最快的,但由于您没有显示代码,我们无法提供建议。但这里有一些通用提示:

<强>1。按序数而不是名称获取列值。

您应该获取列序号,然后使用它,而不是使用reader["column_name"]。例如:

using (var reader = command.ExecuteReader())
{
  int col1Ordinal = reader.GetOrdinal("Column1");
  int col2Ordinal = reader.GetOrdinal("Column2");
  while (reader.Read())
  {
    int col1 = (int)reader[col1Ordinal];
    string col2 = (string)reader[col2Ordinal];
    // do something with col1 and col2's values
  }
}

<强>2。避免多次获取

索引运算符是一种方法调用,因此请避免对同一值多次执行该操作。在您编写的 SqlDataAdapter 代码中

if (row[member.Name] != DBNull.Value)
{
  accessor[person, member.Name] = row[member.Name];
}

如您所见,您调用了 row[member.Name] 两次。相反,您应该获取一次并重新使用该值

object value = row[member.Name];
if (value != DBNull.Value)
{
  accessor[person, member.Name] = value;
}

<强>3。避免反射

我以前从未听说过 TypeAccessorMemberSet。快速搜索一下,它似乎来自一个名为 fast-member 的库。即使它比 .NET 的内置反射更快,我也对它的速度持怀疑态度。我知道它可以显着减少您必须编写的代码量,特别是当您的查询有很多列时。但是,如果您尝试优化性能,特别是如果您对代码与 Entity Framework 相比的性能不满意,则应该删除该依赖项并测试性能差异。

关于c# - 为什么 C# Ado.net 比 Entity Framework 6.1.3 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40453321/

相关文章:

c# - LINQ 中的动态查询

c# - 如何使用C#批量插入MySQL

c# - 如何从 C# 中将 MySQL 数据库函数作为查询参数传递

c# - 对于多个 SQL 调用 - 参数化查询或存储过程,哪个更快?

c# - Entity Framework 代码首先使用导航属性一个Key

linq - 如何使用LINQ异步调用带有子记录的数据库?

c# - Entity Framework 查询以获取子项

c#保护关键字相关问题

c# - 我可以从同一列中选择多个值吗

c# - 更改父级的大小而不影响子级的大小