ごった煮

色々な事を書いてます

UWPでSQLite.NetとEntity Framework Core 1.0を比較してみた話

Entity Framework 7.0がEntity Framework Core 1.0に名称変更されましたので、いい加減使ってみました。

UWPでローカルDBとしてSQLiteを使う用事が出たのですが、意外とSQLiteをUWPで使う手段は、あるみたいなので

どれを使うか悩んだ末ちょっとした比較をしてみました。

 

比較する対象

タイトルの通り、

  • SQLite.NetのPCL版
  • EF Core 1.0

 

の実行速度を比較してみます。

 

使うコード

モデル

モデルは、両方で共通のモデルを使用します。

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

 

EF用コード

System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        long avr = 0;
        for (int i = 0; i < 10; i++)
        {
            using (var db = new BloggingContext())
            {
                sw.Start();
                var blogs = db.Blogs;
                db.Blogs.RemoveRange(blogs);
                db.SaveChanges();
                for (int j = 0; j < 1000; j++)
                {

                    var blog = new Blog
                    {
                        Url = ""
                    };

                    db.Blogs.Add(blog);
                    db.SaveChanges();
                }
                sw.Stop();
                Debug.WriteLine($"{i} : {sw.ElapsedMilliseconds}");
                avr += sw.ElapsedMilliseconds;
                sw.Reset();
            }
        }
        Debug.WriteLine($"Average : {avr / 10}");

EFのコードは、大体感じです。

基本公式のサンプルを改造してるので小難しいことはしてません。

BloggingContextとかは、公式のサンプルまんまなので詳細は、ここ

 

SQLite.NETのコード

        private static SQLiteConnection DbConnection
        {
            get
            {
                return new SQLite.Net.SQLiteConnection(
                    new SQLitePlatformWinRT(),
                    Path.Combine(ApplicationData.Current.LocalFolder.Path, "Storage.db")
                );
            }
        }
            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            long avr = 0;
            for(var i = 0; i < 10; i++)
            {
                sw.Start();
                using (var db = DbConnection)
                {
                    db.DeleteAll();
                    
                    for (var j = 0; j < 1000; j++)
                    {
                        var blog = new Blog
                        {
                            Url = ""
                        };
                        db.Insert(blog);
                    }
                }
                sw.Stop();
                
                Debug.WriteLine($"{i} : {sw.ElapsedMilliseconds}");
                avr += sw.ElapsedMilliseconds;
                sw.Reset();
            }

            Debug.WriteLine($"Average : {avr / 10}");

 

これで、1000insertしてテーブルをremoveしてを10回回して時間を図ります。

 

結果

結果は、下のような感じになりました。

EFでのテーブルのオール削除の方法がよくわかってないので、もしかしたらもっといい方法があるかもしれません(誰か教えて)

 

SQLite.NET

回数

時間(ミリ秒)

1

106863

2

107687

3

108517

4

110428

5

108095

6

107043

7

107457

8

107519

9

107813

10

109549

平均

108097

 

EF

回数

時間(ミリ秒)

1

162394

2

161742

3

160475

4

175358

5

156723

6

158267

7

160659

8

157617

9

158942

10

157785

平均

160996

 

まとめ

今回の内容だと実行時間的には、大体EFの方がSQLite.NETよりも1.5 ~ 1.6倍くらい遅い感じです。

ひたすらInsertのみを行った場合は、SQLite.NETとEFで実行速度に差が見られなかったので、Remove処理が間違っているのかEFのRemove処理が内部的に遅いのかのどっちかっぽいです。

性能差の大半がRemove処理なので、そこまで厄介なことにはならないかと思いますし、個人的には、データの取得なんかがEFの方が分かりやすい印象なのですが、やっぱりまだまだEF Core 1.0はこれからってに期待って感じでしょうか。

 

特にモバイル端末でも稼働することを前提としたUWPの場合、ローエンド端末だと性能差がこれ以上に如実に表れそうな気がするのでその点の考慮が必要かと思います。