Я пытаюсь установить, сколько более медленной Платформы Объекта по Хранимым процедурам. Я надеюсь убедить своего босса позволять нам использовать Платформу Объекта для простоты разработки.
Проблема, я выполнил тест производительности, и похоже, что EF приблизительно в 7 раз медленнее, чем Сохраненный Procs. Я нахожу, что это чрезвычайно трудно верит, и я задаюсь вопросом, пропускаю ли я что-то. Действительно ли это - окончательный Тест? Есть ли что-нибудь, что я могу сделать для увеличения производительности Теста 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 - 10 000 Запросов взяли 2278
Объект - 10 000 Запросов взяли 16277
Важно отметить, что
Запуск с Платформы.NET 4.5, запросы LINQ , кэшировался автоматически . Однако можно все еще использовать , скомпилированные запросы LINQ для сокращения этой стоимости в более позднем выполнении и скомпилированных запросах могут быть более эффективными, чем запросы LINQ, которые автоматически кэшируются.