{"id":19389500,"url":"https://github.com/linksplatform/comparisons.sqlitevsdoublets","last_synced_at":"2025-04-24T00:30:53.046Z","repository":{"id":36018650,"uuid":"199855630","full_name":"linksplatform/Comparisons.SQLiteVSDoublets","owner":"linksplatform","description":"Comparison of SQLite and LinksPlatform's Doublets (links) on basic embeded database operations with objects (create list, read list, delete list).","archived":false,"fork":false,"pushed_at":"2023-11-01T17:27:48.000Z","size":178,"stargazers_count":4,"open_issues_count":5,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-02T22:33:10.282Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/linksplatform.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-07-31T12:51:52.000Z","updated_at":"2023-05-15T17:56:18.000Z","dependencies_parsed_at":"2023-01-16T11:52:47.585Z","dependency_job_id":null,"html_url":"https://github.com/linksplatform/Comparisons.SQLiteVSDoublets","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linksplatform%2FComparisons.SQLiteVSDoublets","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linksplatform%2FComparisons.SQLiteVSDoublets/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linksplatform%2FComparisons.SQLiteVSDoublets/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linksplatform%2FComparisons.SQLiteVSDoublets/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/linksplatform","download_url":"https://codeload.github.com/linksplatform/Comparisons.SQLiteVSDoublets/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250539306,"owners_count":21447286,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-10T10:16:25.289Z","updated_at":"2025-04-24T00:30:52.769Z","avatar_url":"https://github.com/linksplatform.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Actions Status](https://github.com/linksplatform/Comparisons.SQLiteVSDoublets/workflows/CI/badge.svg)](https://github.com/linksplatform/Comparisons.SQLiteVSDoublets/actions?workflow=CI)\n\n# Comparisons.SQLiteVSDoublets ([русская версия](README.ru.md))\n\n![Comparison of models](https://github.com/LinksPlatform/Documentation/raw/master/doc/ModelsComparison/relational_model_vs_associative_model_vs_links.png)\n\nComparison of SQLite and LinksPlatform's Doublets (links) on basic embeded database operations with objects (create list, read list, delete list).\n\nBased on examples from https://github.com/FahaoTang/dotnetcore-examples and https://github.com/Konard/LinksPlatform\n\n## SQLite\n```C#\nusing System.Linq;\nusing Comparisons.SQLiteVSDoublets.Model;\n\nnamespace Comparisons.SQLiteVSDoublets.SQLite\n{\n    public class SQLiteTestRun : TestRun\n    {\n        public SQLiteTestRun(string dbFilename) : base(dbFilename) { }\n\n        public override void Prepare()\n        {\n            using var dbContext = new SQLiteDbContext(DbFilename);\n            dbContext.Database.EnsureCreated();\n        }\n\n        public override void CreateList()\n        {\n            using var dbContext = new SQLiteDbContext(DbFilename);\n            dbContext.BlogPosts.AddRange(BlogPosts.List);\n            dbContext.SaveChanges();\n        }\n\n        public override void ReadList()\n        {\n            using var dbContext = new SQLiteDbContext(DbFilename);\n            foreach (var blogPost in dbContext.BlogPosts)\n            {\n                ReadBlogPosts.Add(blogPost);\n            }\n        }\n\n        public override void DeleteList()\n        {\n            using var dbContext = new SQLiteDbContext(DbFilename);\n            var blogPostsToDelete = dbContext.BlogPosts.ToList();\n            dbContext.BlogPosts.RemoveRange(blogPostsToDelete);\n            dbContext.SaveChanges();\n        }\n    }\n}\n```\n\n## Doublets\n``` C#\nusing System.IO;\nusing Platform.IO;\nusing Comparisons.SQLiteVSDoublets.Model;\n\nnamespace Comparisons.SQLiteVSDoublets.Doublets\n{\n    public class DoubletsTestRun : TestRun\n    {\n        public string DbIndexFilename { get; }\n\n        public DoubletsTestRun(string dbFilename) : base(dbFilename) =\u003e DbIndexFilename = $\"{Path.GetFileNameWithoutExtension(dbFilename)}.links.index\";\n\n        public override void Prepare()\n        {\n            using var dbContext = new DoubletsDbContext(DbFilename, DbIndexFilename);\n        }\n\n        public override void CreateList()\n        {\n            using var dbContext = new DoubletsDbContext(DbFilename, DbIndexFilename);\n            foreach (var blogPost in BlogPosts.List)\n            {\n                dbContext.SaveBlogPost(blogPost);\n            }\n        }\n\n        public override void ReadList()\n        {\n            using var dbContext = new DoubletsDbContext(DbFilename, DbIndexFilename);\n            foreach (var blogPost in dbContext.BlogPosts)\n            {\n                ReadBlogPosts.Add(blogPost);\n            }\n        }\n\n        public override void DeleteList()\n        {\n            using var dbContext = new DoubletsDbContext(DbFilename, DbIndexFilename);\n            var blogPostsToDelete = dbContext.BlogPosts;\n            foreach (var blogPost in blogPostsToDelete)\n            {\n                dbContext.Delete((uint)blogPost.Id);\n            }\n        }\n\n        protected override void DeleteDatabase()\n        {\n            File.Delete(DbFilename);\n            File.Delete(DbIndexFilename);\n        }\n\n        protected override long GetDatabaseSizeInBytes() =\u003e FileHelpers.GetSize(DbFilename) + FileHelpers.GetSize(DbIndexFilename);\n    }\n}\n```\n\n## [Result](https://www.icloud.com/keynote/0cYVNWkWD5RLU0k-XIBs3qWkA#Sqlite_vs_Doublets)\n\n### Performance\n![Image with result of performance comparison between SQLite and Doublets.](https://raw.githubusercontent.com/linksplatform/Documentation/master/doc/Examples/sqlite_vs_doublets_performance.png \"Result of performance comparison between SQLite and Doublets\")\n\n### Disk usage\n![Image with result of disk usage comparison between SQLite and Doublets.](https://raw.githubusercontent.com/linksplatform/Documentation/master/doc/Examples/sqlite_vs_doublets_disk_usage.png \"Result of disk usage comparison between SQLite and Doublets\")\n\n### RAM usage\n![Image with result of RAM usage comparison between SQLite and Doublets.](https://raw.githubusercontent.com/linksplatform/Documentation/master/doc/Examples/sqlite_vs_doublets_ram_usage.png \"Result of RAM usage comparison between SQLite and Doublets\")\n\n### Source data\n``` ini\n\nBenchmarkDotNet=v0.12.0, OS=Windows 10.0.18362\nIntel Core i7-6700K CPU 4.00GHz (Skylake), 1 CPU, 8 logical and 4 physical cores\n.NET Core SDK=3.0.100\n  [Host]     : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), X64 RyuJIT\n  Job-AYEMIX : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), X64 RyuJIT\n\nInvocationCount=1  IterationCount=1  UnrollFactor=1  \nWarmupCount=2  \n\n```\n|   Method |      N |        Mean | Error |        Gen 0 |       Gen 1 | Gen 2 |   Allocated | SizeAfterCreation |\n|--------- |------- |------------:|------:|-------------:|------------:|------:|------------:|------------------:|\n|   **SQLite** |   **1000** |    **719.1 ms** |    **NA** |    **5000.0000** |           **-** |     **-** |    **30.67 MB** |            **925696** |\n| Doublets |   1000 |    145.0 ms |    NA |   34000.0000 |   1000.0000 |     - |   139.37 MB |            767616 |\n|   **SQLite** |  **10000** |  **2,770.3 ms** |    **NA** |   **64000.0000** |  **19000.0000** |     **-** |   **315.71 MB** |           **9056256** |\n| Doublets |  10000 |  1,003.8 ms |    NA |  304000.0000 |  31000.0000 |     - |  1220.55 MB |           6528256 |\n|   **SQLite** | **100000** | **35,853.8 ms** |    **NA** |  **680000.0000** | **151000.0000** |     **-** |  **3234.09 MB** |          **90890240** |\n| Doublets | 100000 | 13,083.4 ms |    NA | 3088000.0000 | 328000.0000 |     - | 12356.33 MB |          64192256 |\n\n## Conclusion\n\nIn this particular comparison, Doublets are faster and use less memory on disk, but this comes with the cost of additional use of RAM (Sqlite uses it less).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinksplatform%2Fcomparisons.sqlitevsdoublets","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flinksplatform%2Fcomparisons.sqlitevsdoublets","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinksplatform%2Fcomparisons.sqlitevsdoublets/lists"}