Skip to content

Commit da5aa2b

Browse files
committed
Comparison logic updated using newest version of Platform.Data.Doublets package. Comparison is customizable now, the number of test runs and records per test run can be easily adjusted.
1 parent f37db45 commit da5aa2b

7 files changed

Lines changed: 156 additions & 61 deletions

File tree

Doublets/DoubletsDbContext.cs

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,29 @@
33
using System.Linq;
44
using Platform.Disposables;
55
using Platform.Collections.Arrays;
6+
using Platform.Collections.Stacks;
67
using Platform.Data;
78
using Platform.Data.Doublets;
8-
using Platform.Data.Doublets.UnaryNumbers;
99
using Platform.Data.Doublets.Decorators;
10-
using Platform.Data.Doublets.Incrementers;
1110
using Platform.Data.Doublets.ResizableDirectMemory;
12-
using Platform.Data.Doublets.Sequences.Converters;
1311
using Platform.Data.Doublets.PropertyOperators;
12+
using Platform.Data.Doublets.Unicode;
13+
using Platform.Data.Doublets.Numbers.Raw;
1414
using Platform.Data.Doublets.Sequences.Indexes;
1515
using Platform.Data.Doublets.Sequences.Walkers;
16-
using Platform.Data.Doublets.Unicode;
16+
using Platform.Data.Doublets.Sequences.Converters;
17+
using Platform.Data.Doublets.Sequences.Frequencies.Cache;
18+
using Platform.Data.Doublets.Sequences.Frequencies.Counters;
1719
using Comparisons.SQLiteVSDoublets.Model;
18-
using LinkAddress = System.UInt32;
20+
using LinkAddress = System.UInt64;
1921

2022
namespace Comparisons.SQLiteVSDoublets.Doublets
2123
{
2224
public class DoubletsDbContext : DisposableBase
2325
{
2426
private readonly LinkAddress _meaningRoot;
25-
private readonly LinkAddress _unaryOne;
2627
private readonly LinkAddress _unicodeSymbolMarker;
2728
private readonly LinkAddress _unicodeSequenceMarker;
28-
private readonly LinkAddress _frequencyMarker;
29-
private readonly LinkAddress _frequencyPropertyMarker;
3029
private readonly LinkAddress _titlePropertyMarker;
3130
private readonly LinkAddress _contentPropertyMarker;
3231
private readonly LinkAddress _publicationDateTimePropertyMarker;
@@ -39,21 +38,16 @@ public class DoubletsDbContext : DisposableBase
3938

4039
public DoubletsDbContext(string dbFilename)
4140
{
42-
_disposableLinks = new ResizableDirectMemoryLinks<LinkAddress>(dbFilename);
43-
_links = _disposableLinks;
44-
_links = new LinksCascadeUsagesResolver<LinkAddress>(_links);
45-
_links = new NonNullContentsLinkDeletionResolver<LinkAddress>(_links);
46-
_links = new LinksCascadeUniquenessAndUsagesResolver<LinkAddress>(_links);
41+
//_disposableLinks = new ResizableDirectMemoryLinks<LinkAddress>(dbFilename);
42+
_disposableLinks = new UInt64ResizableDirectMemoryLinks(dbFilename);
43+
_links = _disposableLinks.DecorateWithAutomaticUniquenessAndUsagesResolution();
4744
_links = new LinksItselfConstantToSelfReferenceResolver<LinkAddress>(_links);
48-
_links = new LinksInnerReferenceExistenceValidator<LinkAddress>(_links);
45+
//_links = new LinksInnerReferenceExistenceValidator<LinkAddress>(_links);
4946

5047
LinkAddress currentMappingLinkIndex = 1;
5148
_meaningRoot = GerOrCreateMeaningRoot(currentMappingLinkIndex++);
52-
_unaryOne = GetOrCreateNextMapping(currentMappingLinkIndex++);
5349
_unicodeSymbolMarker = GetOrCreateNextMapping(currentMappingLinkIndex++);
5450
_unicodeSequenceMarker = GetOrCreateNextMapping(currentMappingLinkIndex++);
55-
_frequencyMarker = GetOrCreateNextMapping(currentMappingLinkIndex++);
56-
_frequencyPropertyMarker = GetOrCreateNextMapping(currentMappingLinkIndex++);
5751
_titlePropertyMarker = GetOrCreateNextMapping(currentMappingLinkIndex++);
5852
_contentPropertyMarker = GetOrCreateNextMapping(currentMappingLinkIndex++);
5953
_publicationDateTimePropertyMarker = GetOrCreateNextMapping(currentMappingLinkIndex++);
@@ -62,21 +56,19 @@ public DoubletsDbContext(string dbFilename)
6256
_defaultLinkPropertyOperator = new PropertiesOperator<LinkAddress>(_links);
6357

6458
// Create StringToUnicodeSequenceConverter and UnicodeSequenceToStringConverter
65-
var unaryNumberToAddressConverter = new UnaryNumberToAddressAddOperationConverter<LinkAddress>(_links, _unaryOne);
66-
var powerOf2ToUnaryNumberConverter = new PowerOf2ToUnaryNumberConverter<LinkAddress>(_links, _unaryOne);
67-
var addressToUnaryNumberConverter = new AddressToUnaryNumberConverter<LinkAddress>(_links, powerOf2ToUnaryNumberConverter);
68-
var unaryNumberIncrementer = new UnaryNumberIncrementer<LinkAddress>(_links, _unaryOne);
69-
var frequencyIncrementer = new FrequencyIncrementer<LinkAddress>(_links, _frequencyMarker, _unaryOne, unaryNumberIncrementer);
70-
var frequencyPropertyOperator = new PropertyOperator<LinkAddress>(_links, _frequencyPropertyMarker, _frequencyMarker);
71-
var index = new FrequencyIncrementingSequenceIndex<LinkAddress>(_links, frequencyPropertyOperator, frequencyIncrementer);
72-
var linkToItsFrequencyNumberConverter = new LinkToItsFrequencyNumberConveter<LinkAddress>(_links, frequencyPropertyOperator, unaryNumberToAddressConverter);
59+
var numberToAddressConverter = new RawNumberToAddressConverter<LinkAddress>();
60+
var addressToNumberConverter = new AddressToRawNumberConverter<LinkAddress>();
61+
var totalSequenceSymbolFrequencyCounter = new TotalSequenceSymbolFrequencyCounter<LinkAddress>(_links);
62+
var linkFrequenciesCache = new LinkFrequenciesCache<LinkAddress>(_links, totalSequenceSymbolFrequencyCounter);
63+
var index = new CachedFrequencyIncrementingSequenceIndex<LinkAddress>(linkFrequenciesCache);
64+
var linkToItsFrequencyNumberConverter = new FrequenciesCacheBasedLinkToItsFrequencyNumberConverter<LinkAddress>(linkFrequenciesCache);
7365
var sequenceToItsLocalElementLevelsConverter = new SequenceToItsLocalElementLevelsConverter<LinkAddress>(_links, linkToItsFrequencyNumberConverter);
7466
var optimalVariantConverter = new OptimalVariantConverter<LinkAddress>(_links, sequenceToItsLocalElementLevelsConverter);
7567
var unicodeSymbolCriterionMatcher = new UnicodeSymbolCriterionMatcher<LinkAddress>(_links, _unicodeSymbolMarker);
7668
var unicodeSequenceCriterionMatcher = new UnicodeSequenceCriterionMatcher<LinkAddress>(_links, _unicodeSequenceMarker);
77-
var charToUnicodeSymbolConverter = new CharToUnicodeSymbolConverter<LinkAddress>(_links, addressToUnaryNumberConverter, _unicodeSymbolMarker);
78-
var unicodeSymbolToCharConverter = new UnicodeSymbolToCharConverter<LinkAddress>(_links, unaryNumberToAddressConverter, unicodeSymbolCriterionMatcher);
79-
var sequenceWalker = new LeveledSequenceWalker<LinkAddress>(_links, unicodeSymbolCriterionMatcher.IsMatched);
69+
var charToUnicodeSymbolConverter = new CharToUnicodeSymbolConverter<LinkAddress>(_links, addressToNumberConverter, _unicodeSymbolMarker);
70+
var unicodeSymbolToCharConverter = new UnicodeSymbolToCharConverter<LinkAddress>(_links, numberToAddressConverter, unicodeSymbolCriterionMatcher);
71+
var sequenceWalker = new RightSequenceWalker<LinkAddress>(_links, new DefaultStack<LinkAddress>(), unicodeSymbolCriterionMatcher.IsMatched);
8072
_stringToUnicodeSymbolConverter = new StringToUnicodeSequenceConverter<LinkAddress>(_links, charToUnicodeSymbolConverter, index, optimalVariantConverter, _unicodeSequenceMarker);
8173
_unicodeSequenceToStringConverter = new UnicodeSequenceToStringConverter<LinkAddress>(_links, unicodeSequenceCriterionMatcher, sequenceWalker, unicodeSymbolToCharConverter);
8274
}

Doublets/DoubletsTestRun.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System;
2-
using System.Linq;
1+
using System.Linq;
32
using Comparisons.SQLiteVSDoublets.Model;
43

54
namespace Comparisons.SQLiteVSDoublets.Doublets
@@ -21,8 +20,7 @@ public override void CreateList()
2120
{
2221
if (!dbContext.BlogPosts.Any())
2322
{
24-
var blogPosts = BlogPosts.List;
25-
foreach (BlogPost blogPost in blogPosts)
23+
foreach (var blogPost in BlogPosts.List)
2624
{
2725
dbContext.CreateBlogPost(blogPost);
2826
}
@@ -32,12 +30,11 @@ public override void CreateList()
3230

3331
public override void ReadList()
3432
{
35-
Console.WriteLine();
3633
using (var dbContext = new DoubletsDbContext(DbFilename))
3734
{
3835
foreach (var blogPost in dbContext.BlogPosts)
3936
{
40-
Console.WriteLine(blogPost);
37+
ReadBlogPosts.Add(blogPost);
4138
}
4239
}
4340
}
@@ -49,7 +46,7 @@ public override void DeleteList()
4946
var blogPosts = dbContext.BlogPosts;
5047
foreach (var blogPost in blogPosts)
5148
{
52-
dbContext.Delete((uint)blogPost.Id);
49+
dbContext.Delete((ulong)blogPost.Id);
5350
}
5451
}
5552
}

Model/BlogPosts.cs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,33 @@ namespace Comparisons.SQLiteVSDoublets.Model
66
{
77
public static class BlogPosts
88
{
9-
public static readonly IReadOnlyList<BlogPost> List;
9+
public static IReadOnlyList<BlogPost> List { get; private set; }
1010

1111
static BlogPosts()
1212
{
13-
var blogPosts = new List<BlogPost>()
13+
List = new List<BlogPost>();
14+
}
15+
16+
static public void GenerateData(int numberOfRecords)
17+
{
18+
var contentStrings = new string[]
1419
{
15-
new BlogPost{ Content="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis malesuada blandit mauris nec bibendum. Phasellus feugiat vehicula mauris et aliquet. Integer et gravida velit, in rutrum leo. Duis pretium, nunc ac posuere porttitor, augue sapien commodo tortor, nec consequat lorem eros ultricies odio. Aliquam varius congue ex nec viverra. Pellentesque eu velit tellus. Donec ac luctus nisi. Curabitur dignissim sodales mauris eu semper. Ut pretium lorem nulla, sit amet auctor arcu placerat vitae. Quisque lacinia dolor et consectetur fermentum. Nam ac orci vitae nulla aliquam tempor ac a nibh. Ut ac tincidunt lacus. Morbi vitae felis lorem." },
16-
new BlogPost{ Content="Curabitur tincidunt nibh sit amet finibus dictum. Suspendisse aliquet arcu non rutrum ultrices. Integer ullamcorper mauris sit amet nibh aliquam, et tempor turpis hendrerit. In molestie elit et mauris rutrum, non auctor ligula ultricies. Vestibulum dignissim mauris finibus libero interdum hendrerit. Nunc vitae ipsum porttitor, egestas magna ut, sagittis sem. Donec euismod ac tortor vel porta. Vivamus convallis, ex at vestibulum rutrum, velit purus venenatis metus, sit amet aliquam sapien nibh quis elit. Aenean id neque a orci sodales venenatis. Integer ut orci ligula. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent molestie dolor non lobortis ornare. Duis quis nisl sollicitudin, accumsan ante sed, eleifend velit. Maecenas maximus sed ante nec auctor." },
17-
new BlogPost{ Content="Donec vitae felis lectus. Aenean velit sapien, porttitor ut feugiat a, consectetur et risus. Proin ac viverra sem. Nullam sagittis ex tortor, eu pellentesque tellus efficitur at. Nunc non egestas leo. Nam sed suscipit neque. Nam sodales vel neque eget eleifend. Vivamus in condimentum elit, consectetur commodo ex. Suspendisse rutrum, sapien efficitur cursus sodales, dolor orci pulvinar mauris, eu fringilla leo ex id leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin rhoncus sapien massa, molestie vestibulum augue hendrerit nec. Aliquam malesuada varius sapien id accumsan. Duis blandit aliquet felis, nec pellentesque lacus tincidunt et. Cras sed ligula vel nisl laoreet sagittis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Praesent tristique a neque aliquet aliquam." },
18-
new BlogPost{ Content="Aliquam sed egestas felis. Maecenas sollicitudin nisl in sapien posuere vulputate. Suspendisse eleifend sem magna, interdum consectetur augue venenatis at. Vivamus ornare orci vel orci sodales maximus. Donec ultricies felis ac nulla fermentum gravida. Phasellus vulputate turpis odio, a varius nibh luctus et. Aliquam tincidunt, metus ut congue porttitor, nibh dui ullamcorper quam, a eleifend elit ipsum sit amet quam. Aenean venenatis mollis interdum. Nunc cursus ex sit amet enim lacinia hendrerit. Nullam at libero iaculis, consectetur velit in, porta sem. Ut mattis ut ex in imperdiet. Maecenas pellentesque sit amet dui eget vehicula. Sed posuere, arcu pretium convallis tincidunt, turpis leo dignissim felis, non euismod diam magna a risus. Suspendisse a arcu nec turpis pulvinar ullamcorper. Nunc iaculis malesuada elit eu pretium. Aenean a neque a sapien tincidunt faucibus." },
19-
new BlogPost{ Content="Ut a eleifend augue, eget posuere augue. Proin purus neque, pretium condimentum ipsum ut, venenatis tincidunt nunc. In vitae odio in justo pharetra tincidunt. Maecenas vel tellus interdum, suscipit tellus sit amet, cursus justo. Mauris sollicitudin euismod molestie. Cras eros nisi, molestie vel elementum ut, consequat ac nunc. In consectetur nulla vitae interdum elementum. Praesent faucibus magna et iaculis congue. Curabitur convallis cursus porttitor. Praesent hendrerit justo ut sem convallis sollicitudin eu at odio." }
20+
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis malesuada blandit mauris nec bibendum. Phasellus feugiat vehicula mauris et aliquet. Integer et gravida velit, in rutrum leo. Duis pretium, nunc ac posuere porttitor, augue sapien commodo tortor, nec consequat lorem eros ultricies odio. Aliquam varius congue ex nec viverra. Pellentesque eu velit tellus. Donec ac luctus nisi. Curabitur dignissim sodales mauris eu semper. Ut pretium lorem nulla, sit amet auctor arcu placerat vitae. Quisque lacinia dolor et consectetur fermentum. Nam ac orci vitae nulla aliquam tempor ac a nibh. Ut ac tincidunt lacus. Morbi vitae felis lorem.",
21+
"Curabitur tincidunt nibh sit amet finibus dictum. Suspendisse aliquet arcu non rutrum ultrices. Integer ullamcorper mauris sit amet nibh aliquam, et tempor turpis hendrerit. In molestie elit et mauris rutrum, non auctor ligula ultricies. Vestibulum dignissim mauris finibus libero interdum hendrerit. Nunc vitae ipsum porttitor, egestas magna ut, sagittis sem. Donec euismod ac tortor vel porta. Vivamus convallis, ex at vestibulum rutrum, velit purus venenatis metus, sit amet aliquam sapien nibh quis elit. Aenean id neque a orci sodales venenatis. Integer ut orci ligula. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent molestie dolor non lobortis ornare. Duis quis nisl sollicitudin, accumsan ante sed, eleifend velit. Maecenas maximus sed ante nec auctor.",
22+
"Donec vitae felis lectus. Aenean velit sapien, porttitor ut feugiat a, consectetur et risus. Proin ac viverra sem. Nullam sagittis ex tortor, eu pellentesque tellus efficitur at. Nunc non egestas leo. Nam sed suscipit neque. Nam sodales vel neque eget eleifend. Vivamus in condimentum elit, consectetur commodo ex. Suspendisse rutrum, sapien efficitur cursus sodales, dolor orci pulvinar mauris, eu fringilla leo ex id leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin rhoncus sapien massa, molestie vestibulum augue hendrerit nec. Aliquam malesuada varius sapien id accumsan. Duis blandit aliquet felis, nec pellentesque lacus tincidunt et. Cras sed ligula vel nisl laoreet sagittis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Praesent tristique a neque aliquet aliquam.",
23+
"Aliquam sed egestas felis. Maecenas sollicitudin nisl in sapien posuere vulputate. Suspendisse eleifend sem magna, interdum consectetur augue venenatis at. Vivamus ornare orci vel orci sodales maximus. Donec ultricies felis ac nulla fermentum gravida. Phasellus vulputate turpis odio, a varius nibh luctus et. Aliquam tincidunt, metus ut congue porttitor, nibh dui ullamcorper quam, a eleifend elit ipsum sit amet quam. Aenean venenatis mollis interdum. Nunc cursus ex sit amet enim lacinia hendrerit. Nullam at libero iaculis, consectetur velit in, porta sem. Ut mattis ut ex in imperdiet. Maecenas pellentesque sit amet dui eget vehicula. Sed posuere, arcu pretium convallis tincidunt, turpis leo dignissim felis, non euismod diam magna a risus. Suspendisse a arcu nec turpis pulvinar ullamcorper. Nunc iaculis malesuada elit eu pretium. Aenean a neque a sapien tincidunt faucibus.",
24+
"Ut a eleifend augue, eget posuere augue. Proin purus neque, pretium condimentum ipsum ut, venenatis tincidunt nunc. In vitae odio in justo pharetra tincidunt. Maecenas vel tellus interdum, suscipit tellus sit amet, cursus justo. Mauris sollicitudin euismod molestie. Cras eros nisi, molestie vel elementum ut, consequat ac nunc. In consectetur nulla vitae interdum elementum. Praesent faucibus magna et iaculis congue. Curabitur convallis cursus porttitor. Praesent hendrerit justo ut sem convallis sollicitudin eu at odio."
2025
};
26+
var blogPosts = new BlogPost[numberOfRecords];
2127
Random random = new Random();
22-
for (int i = 1; i <= 5; i++)
28+
for (int i = 0; i < numberOfRecords; i++)
2329
{
24-
blogPosts[i - 1].Title = $"Blog post {i}";
25-
blogPosts[i - 1].PublicationDateTime = DateTime.UtcNow.AddDays(random.NextDouble() * -30);
30+
blogPosts[i] = new BlogPost()
31+
{
32+
Title = $"Blog post {i + 1}",
33+
Content = contentStrings[random.Next(0, 5)],
34+
PublicationDateTime = DateTime.UtcNow.AddDays(random.NextDouble() * -30)
35+
};
2636
}
2737
List = new ReadOnlyCollection<BlogPost>(blogPosts);
2838
}

Program.cs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,51 @@
1-
using Comparisons.SQLiteVSDoublets.SQLite;
1+
using System;
2+
using System.Linq;
3+
using System.Collections.Generic;
4+
using Comparisons.SQLiteVSDoublets.SQLite;
25
using Comparisons.SQLiteVSDoublets.Doublets;
6+
using Comparisons.SQLiteVSDoublets.Model;
37

48
namespace Comparisons.SQLiteVSDoublets
59
{
610
class Program
711
{
812
static void Main()
913
{
10-
new SQLiteTestRun("test.db").Run();
11-
new DoubletsTestRun("test.links").Run();
14+
const int numberOfTestRuns = 1;
15+
const int numberOfRecordsPerTestRun = 5;
16+
BlogPosts.GenerateData(numberOfRecordsPerTestRun);
17+
var sqliteTestRuns = new List<SQLiteTestRun>();
18+
var doubletsTestRuns = new List<DoubletsTestRun>();
19+
for (int i = 0; i < numberOfTestRuns; i++)
20+
{
21+
var sqliteTestRun = new SQLiteTestRun("test.db");
22+
sqliteTestRun.Run();
23+
sqliteTestRuns.Add(sqliteTestRun);
24+
var doubletsTestRun = new DoubletsTestRun("test.links");
25+
doubletsTestRun.Run();
26+
doubletsTestRuns.Add(doubletsTestRun);
27+
}
28+
Console.WriteLine("SQLite results:");
29+
var averageSqliteResults = GetResultsAverage(sqliteTestRuns);
30+
Console.WriteLine(averageSqliteResults.ToString());
31+
Console.WriteLine("Doublets results:");
32+
var averageDoubletsResults = GetResultsAverage(doubletsTestRuns);
33+
Console.WriteLine(averageDoubletsResults.ToString());
34+
}
35+
36+
private static TestRunResults GetResultsAverage(IEnumerable<TestRun> testRuns)
37+
{
38+
return new TestRunResults()
39+
{
40+
PrepareTime = new TimeSpan((long)testRuns.Select(x => x.Results.PrepareTime.Ticks).Average()),
41+
DbSizeAfterPrepare = (long)testRuns.Select(x => x.Results.DbSizeAfterPrepare).Average(),
42+
ListCreationTime = new TimeSpan((long)testRuns.Select(x => x.Results.ListCreationTime.Ticks).Average()),
43+
DbSizeAfterCreation = (long)testRuns.Select(x => x.Results.DbSizeAfterCreation).Average(),
44+
ListReadingTime = new TimeSpan((long)testRuns.Select(x => x.Results.ListReadingTime.Ticks).Average()),
45+
DbSizeAfterReading = (long)testRuns.Select(x => x.Results.DbSizeAfterReading).Average(),
46+
ListDeletionTime = new TimeSpan((long)testRuns.Select(x => x.Results.ListDeletionTime.Ticks).Average()),
47+
DbSizeAfterDeletion = (long)testRuns.Select(x => x.Results.DbSizeAfterDeletion).Average(),
48+
};
1249
}
1350
}
1451
}

0 commit comments

Comments
 (0)