Является ли .Net Core намного медленнее, чем .Net Framework в SQL-соединении?

#.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