实体框架 – 实体框架与存储过程 – 性能度量

我试图确定多少更慢的实体框架是存储过程。我希望说服我的老板让我们使用Entity Framework来简化开发。

问题是我运行性能测试,看起来EF比存储Procs慢7倍。我觉得这很难相信,我想知道我是否错过了一些东西。这是一个决定性的测试吗?有什么我可以做,以提高EF测试的性能吗?

        var queries = 10000;

        //  Stored Proc Test
        Stopwatch spStopwatch = new Stopwatch();
        spStopwatch.Start();
        for (int i = 0; i < queries; i++ )
        {
            using (var sqlConn = new SlxDbConnection().Connection)
            {
                var cmd = new SqlCommand("uspSearchPerformanceTest", sqlConn) { CommandType = CommandType.StoredProcedure };

                cmd.Parameters.AddWithValue("@searchText", "gstrader");
                sqlConn.Open();
                SqlDataReader dr = cmd.ExecuteReader();

                List<User> users = new List<User>();
                while (dr.Read())
                {
                    users.Add(new User
                    {
                        IsAnonymous = Convert.ToBoolean(dr["IsAnonymous"]),
                        LastActivityDate = Convert.ToDateTime(dr["LastActivityDate"]),
                        LoweredUserName = dr["LoweredUserName"].ToString(),
                        MobileAlias = dr["MobileAlias"].ToString(),
                        UserId = new Guid(dr["UserId"].ToString()),
                        UserName = (dr["UserName"]).ToString()
                    });
                }

                var username = users.First().UserName;
                sqlConn.Close();
            }
        }
        spStopwatch.Stop();
        Console.WriteLine("SP - {0} Queries took {1}", queries, spStopwatch.ElapsedMilliseconds );

        //  EF  Test
        Stopwatch entityStopWatch = new Stopwatch();

        var context = new SlxDbContext();
        var userSet = context.Set<User>();
        entityStopWatch.Start();
        for (int i = 0; i < queries; i++)
        {
            User user = userSet.Where(x => x.UserName == "gstrader").First();
        }

        entityStopWatch.Stop();
        Console.WriteLine("Entity - {0} Queries took {1}", queries, entityStopWatch.ElapsedMilliseconds);

结果:

SP – 10000查询花了2278

实体 – 10000查询耗用了16277

最佳答案
您可以执行一些操作来优化查询。 Here on MSDN你可以找到一个不错的概述。

但是说实话,使用手动映射的存储过程的性能总是更快。但问自己,性能有多重要?在大多数项目中,开发时间比性能更重要。什么是更难发展?原始查询与解析还是实体框架查询?

ORM不是设计的,因为它们的性能比手写方法好得多。我们使用它们,因为开发是那么容易!

如果您使用Entity Framework编写应用程序并隐藏存储库模式后面的所有查询,您可以快速开发,然后在性能成为问题时,测量应用程序以检测瓶颈。然后也许一些查询需要优化,可以移动到存储过程和手动映射。

转载注明原文:实体框架 – 实体框架与存储过程 – 性能度量 - 代码日志