Почему EF Core 3.1.1 медленнее, чем EF Core 2.2.6? У вас тоже такая же встреча? - PullRequest
3 голосов
/ 18 января 2020

Я проверил, сохранив 10000 записей и получив 10000 записей. Все в новых проектах. Никаких дополнительных кодов.

EF Core 2.2.6 : Сохранить 10000 записей: 1414.1892мс. Получить 10 000 записей: 0 0003 мс.

EF Core 3.1.1 : сохранить 10 000 записей: 5029,9279 мс. Получить 10000 записей: 0,0069 мс.

Dapper : сохранить 10 000 записей: 4782,7224 мс. Извлечение 10000 записей: 12.2705 мс.

EF Core 2.2.6 и 3.1.1 Код

Stopwatch sw = new Stopwatch();
        sw.Start();
        List<User> list = new List<User>();
        for (int i = 0; i <= 10000; i++)
        {
            User user = new User()
            {
                Name = $"User {i}",
                Age = i + 1
            };

            list.Add(user);
        }

        TestDBContext db = new TestDBContext();
        db.AddRange(list);
        db.SaveChanges();
        sw.Stop();
        TimeSpan ts = sw.Elapsed;

        string s1 = ts.TotalMilliseconds.ToString();

        sw.Restart();
        sw.Start();
        var s = db.User;
        sw.Stop();
        ts = sw.Elapsed;
        string s2 = ts.TotalMilliseconds.ToString();

Код Dapper

Stopwatch sw = new Stopwatch();
        sw.Start();
        List<User> list = new List<User>();

        using (var db = new SqlConnection("Server=SQLEXPRESS;Database=TestDB;Trusted_Connection=true;"))
        {
            for (int i = 0; i <= 10000; i++)
            {
                string query = $"insert into [User] (Name, Age) values ('User {i}', {i + 1})";
                db.Query<User>(query);
            }
        }

        sw.Stop();
        TimeSpan ts = sw.Elapsed;

        string s1 = ts.TotalMilliseconds.ToString();

        sw.Restart();
        sw.Start();
        using (var db = new SqlConnection("Server=SQLEXPRESS;Database=TestDB;Trusted_Connection=true;"))
        {
            string query = "select * from [User]";
            var s = db.Query<User>(query);
        }
        sw.Stop();
        ts = sw.Elapsed;
        string s2 = ts.TotalMilliseconds.ToString();

ИЗД.

Используется EFCore.BulkExtensions для EFCore. Используется SqlBulkCopy для Dapper. Запустите снова 3 раза.

EF Core 2.2.6 Выполнение 1: Сохранение 10 000 записей: 108.1211 Извлечение 10 000 записей: 0,001

EF Core 2.2.6 Запуск 2: Сохранение 10 000 записей: 75,7498 Извлечение 10 000 записей: 0 0007

EF Core 2.2.6 Прогон 3: Сохранение 10 000 записей: 49,9556 Извлечение 10 000 записей: 0 0007

EF Core 3.1.1 Прогон 1: Сохранение 10000 записей: 320,7665. Получить 10 000 записей: 0,001.

EF Core 3.1.1 Прогон 2: Сохранить 10000 записей: 67,0531. Получить 10 000 записей: 0,001.

EF Core 3.1.1 Прогон 3: Сохранить 10000 записей: 71,3584. Извлечь 10 000 записей: 0,0018.

Dapper Run 1: Сохранить 10000 записей: 99,0564. Получить 10 000 записей: 8,2078.

Dapper Run 2: Сохранить 10000 записей: 36,2659. Получить 10 000 записей: 10.0161.

Dapper Run 3 Сохранить 10000 записей: 36.8418. Получить 10 000 записей: 10,6243.

...