#.net #.net-core #ado.net #.net-framework-version #sqlclient
#.net #.net-core #ado.net #.net-framework-version #sqlclient
Вопрос:
Запуск кода в .NET Core для подключения к базе данных SQL Server кажется намного медленнее, чем в полном.NET Framework. Так ли это? Или я делаю что-то не так?
У меня есть SQL Server 2017 на моем ПК, и я хочу запустить простую хранимую процедуру, например
CREATE PROCEDURE OneRowSelect
AS
BEGIN
SELECT 1
END
GO
Я использую SQL Client 4.6.0 для подключения к базе данных и получаю результат этой процедуры в своем коде. Итак, я написал библиотеку .Net Standard 2.0, которая предоставляет этот код:
private const string connectionString = @"data source=.;initial catalog=TestDB;Integrated Security=SSPI;";
private const string command = @"OneRowSelect";
public static async System.Threading.Tasks.Task Execute()
{
using (SqlConnection con = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(command, con)
{
CommandType = CommandType.StoredProcedure
})
{
con.Open();
var data = await cmd.ExecuteReaderAsync();
while (data.Read())
{
var res = data[0];
}
}
}
}
Наконец, я написал два проекта в .NET Core 2.2 и .NET Framework 4.7.2 и ссылался на эту стандартную библиотеку .NET в этих двух проектах и регистрировал время выполнения Execute
функции Stopwatch
.
Мой код в этих двух проектах:
Stopwatch stopwatch = Stopwatch.StartNew();
for (int i = 0; i < repeat; i )
await Runner.Execute();
stopwatch.Stop();
Результат был невероятным. .NET Core работает намного медленнее, чем .NET Framework в моей системе. Результаты:
- Среднее время работы .NET Framework: 2,2 мс
- Среднее время работы .NET Core: 36,7 мс
Я ошибаюсь или .NET Core намного медленнее, чем .NET Framework?
Комментарии:
1. Вы вызывали этот метод только один раз или несколько раз? (Если вы измеряете одно время, на него могут повлиять всевозможные вещи. В идеале используйте Benchmark.NET чтобы сделать это правильно.) Пробовали ли вы такой же тест с полезным запросом / SP, а не безоперационным?
2. Я запускаю этот метод 100 раз и получаю среднее значение (также я повторяю этот тест несколько раз). Да, я протестировал это с точной базой данных, которая извлекает некоторые идентификаторы моей таблицы, и я видел некоторые результаты, подобные этому
3. Возможно, стоит рассмотреть некоторые потенциальные различия, например, использует ли .NET Core TCP / IP, а .NET Framework использует именованные каналы. Я не знаю, так ли это, но заставить их использовать один и тот же транспорт было бы, по крайней мере, интересным началом. Я очень сомневаюсь, что речь идет о самой среде CLR.
4. Можете ли вы проверить, улучшится ли производительность, если вы удалите асинхронный вызов? Тогда это может быть связано с этой проблемой.
5. ОК. Я только что удалил асинхронные вызовы и протестировал его снова. Результаты .Net-Framework становятся 4.2, а .Net-Core становятся 18.4, что также намного медленнее, чем .Net-Framework