Skip to content

Commit 9079209

Browse files
authored
autoreadbuff (#245)
1 parent 03ca09a commit 9079209

File tree

17 files changed

+47
-290
lines changed

17 files changed

+47
-290
lines changed

BitFaster.Caching.Benchmarks/Lfu/LfuJustGetOrAdd.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ public class LfuJustGetOrAdd
2222

2323
const int stripes = 1;
2424
private static readonly BackgroundThreadScheduler background = new BackgroundThreadScheduler();
25-
private static readonly ConcurrentLfu<int, int> concurrentLfu = new ConcurrentLfu<int, int>(stripes, 9, background, EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
25+
private static readonly ConcurrentLfu<int, int> concurrentLfu = new ConcurrentLfu<int, int>(stripes, 9, background, EqualityComparer<int>.Default);
2626

27-
private static readonly ConcurrentLfu<int, int> concurrentLfuFore = new ConcurrentLfu<int, int>(stripes, 9, new ForegroundScheduler(), EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
28-
private static readonly ConcurrentLfu<int, int> concurrentLfuTp = new ConcurrentLfu<int, int>(stripes, 9, new ThreadPoolScheduler(), EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
29-
private static readonly ConcurrentLfu<int, int> concurrentLfuNull = new ConcurrentLfu<int, int>(stripes, 9, new NullScheduler(), EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
27+
private static readonly ConcurrentLfu<int, int> concurrentLfuFore = new ConcurrentLfu<int, int>(stripes, 9, new ForegroundScheduler(), EqualityComparer<int>.Default);
28+
private static readonly ConcurrentLfu<int, int> concurrentLfuTp = new ConcurrentLfu<int, int>(stripes, 9, new ThreadPoolScheduler(), EqualityComparer<int>.Default);
29+
private static readonly ConcurrentLfu<int, int> concurrentLfuNull = new ConcurrentLfu<int, int>(stripes, 9, new NullScheduler(), EqualityComparer<int>.Default);
3030

3131
[GlobalSetup]
3232
public void GlobalSetup()

BitFaster.Caching.Benchmarks/Lru/LruJustGetOrAdd.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public class LruJustGetOrAdd
4848
private static readonly ICache<int, int> atomicFastLru = new ConcurrentLruBuilder<int, int>().WithConcurrencyLevel(8).WithCapacity(9).WithAtomicGetOrAdd().Build();
4949

5050
private static readonly BackgroundThreadScheduler background = new BackgroundThreadScheduler();
51-
private static readonly ConcurrentLfu<int, int> concurrentLfu = new ConcurrentLfu<int, int>(1, 9, background, EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
51+
private static readonly ConcurrentLfu<int, int> concurrentLfu = new ConcurrentLfu<int, int>(1, 9, background, EqualityComparer<int>.Default);
5252

5353

5454
private static readonly int key = 1;

BitFaster.Caching.HitRateAnalysis/Analysis.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
using System.Collections.Generic;
33
using System.Globalization;
44
using System.IO;
5-
using System.Linq;
6-
using System.Text;
7-
using System.Threading.Tasks;
85
using BitFaster.Caching.Lfu;
96
using BitFaster.Caching.Lru;
107
using BitFaster.Caching.Scheduler;
@@ -22,7 +19,7 @@ public Analysis(int cacheSize)
2219
{
2320
concurrentLru = new ConcurrentLru<K, int>(1, cacheSize, EqualityComparer<K>.Default);
2421
classicLru = new ClassicLru<K, int>(1, cacheSize, EqualityComparer<K>.Default);
25-
concurrentLfu = new ConcurrentLfu<K, int>(1, cacheSize, new ForegroundScheduler(), EqualityComparer<K>.Default, LfuBufferSize.Default(1, 128));
22+
concurrentLfu = new ConcurrentLfu<K, int>(1, cacheSize, new ForegroundScheduler(), EqualityComparer<K>.Default);
2623
}
2724

2825
public int CacheSize => concurrentLru.Capacity;

BitFaster.Caching.ThroughputAnalysis/Program.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class Program
2222
const double s = 0.86;
2323
const int n = 500;
2424
static int capacity = 500;
25-
const int maxThreads = 64;
25+
const int maxThreads = 52;
2626
const int sampleCount = 2000;
2727
const int repeatCount = 400;
2828

@@ -58,7 +58,6 @@ static void Main(string[] args)
5858
resultTable.Columns.Add(tc.ToString());
5959
}
6060

61-
6261
DataRow classicLru = resultTable.NewRow();
6362
DataRow memoryCache = resultTable.NewRow();
6463
DataRow concurrentLru = resultTable.NewRow();
@@ -102,7 +101,7 @@ static void Main(string[] args)
102101
for (int i = 0; i < warmup + runs; i++)
103102
{
104103
var scheduler = new BackgroundThreadScheduler();
105-
results[i] = MeasureThroughput(new ConcurrentLfu<int, int>(concurrencyLevel: tc, capacity: capacity, scheduler: scheduler, EqualityComparer<int>.Default, LfuBufferSize.Default(concurrencyLevel: tc, capacity: capacity)), tc);
104+
results[i] = MeasureThroughput(new ConcurrentLfu<int, int>(concurrencyLevel: tc, capacity: capacity, scheduler: scheduler, EqualityComparer<int>.Default), tc);
106105
scheduler.Dispose();
107106
}
108107
avg = AverageLast(results, runs) / 1000000;

BitFaster.Caching.UnitTests/Buffers/StripedBufferSizeTests.cs

Lines changed: 0 additions & 42 deletions
This file was deleted.

BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuBuilderTests.cs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using BitFaster.Caching.Atomic;
3-
using BitFaster.Caching.Buffers;
43
using BitFaster.Caching.Lfu;
54
using BitFaster.Caching.Scheduler;
65
using FluentAssertions;
@@ -53,16 +52,6 @@ public void TestComparer()
5352
lfu.TryGet("A", out var value).Should().BeTrue();
5453
}
5554

56-
[Fact]
57-
public void TestBufferConfiguraiton()
58-
{
59-
ICache<string, int> lfu = new ConcurrentLfuBuilder<string, int>()
60-
.WithBufferConfiguration(new LfuBufferSize(
61-
new StripedBufferSize(128, 2)
62-
))
63-
.Build();
64-
}
65-
6655
// 1
6756
[Fact]
6857
public void WithScopedValues()

BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuTests.cs

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class ConcurrentLfuTests
1818
{
1919
private readonly ITestOutputHelper output;
2020

21-
private ConcurrentLfu<int, int> cache = new ConcurrentLfu<int, int>(1, 20, new BackgroundThreadScheduler(), EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
21+
private ConcurrentLfu<int, int> cache = new ConcurrentLfu<int, int>(1, 20, new BackgroundThreadScheduler(), EqualityComparer<int>.Default);
2222
private ValueFactory valueFactory = new ValueFactory();
2323

2424
public ConcurrentLfuTests(ITestOutputHelper output)
@@ -75,7 +75,7 @@ public void WhenItemsAddedExceedsCapacityItemsAreDiscarded()
7575
[Fact]
7676
public void WhenItemIsEvictedItIsDisposed()
7777
{
78-
var dcache = new ConcurrentLfu<int, DisposableItem>(1, 20, new BackgroundThreadScheduler(), EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
78+
var dcache = new ConcurrentLfu<int, DisposableItem>(1, 20, new BackgroundThreadScheduler(), EqualityComparer<int>.Default);
7979
var disposables = new DisposableItem[25];
8080

8181
for (int i = 0; i < 25; i++)
@@ -299,7 +299,7 @@ public void WriteUpdatesProtectedLruOrder()
299299
[Fact]
300300
public void WhenHitRateChangesWindowSizeIsAdapted()
301301
{
302-
cache = new ConcurrentLfu<int, int>(1, 20, new NullScheduler(), EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
302+
cache = new ConcurrentLfu<int, int>(1, 20, new NullScheduler(), EqualityComparer<int>.Default);
303303

304304
// First completely fill the cache, push entries into protected
305305
for (int i = 0; i < 20; i++)
@@ -368,13 +368,13 @@ public void WhenHitRateChangesWindowSizeIsAdapted()
368368
public void ReadSchedulesMaintenanceWhenBufferIsFull()
369369
{
370370
var scheduler = new TestScheduler();
371-
cache = new ConcurrentLfu<int, int>(1, 20, scheduler, EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
371+
cache = new ConcurrentLfu<int, int>(1, 20, scheduler, EqualityComparer<int>.Default);
372372

373373
cache.GetOrAdd(1, k => k);
374374
scheduler.RunCount.Should().Be(1);
375375
cache.PendingMaintenance();
376376

377-
for (int i = 0; i < LfuBufferSize.DefaultBufferSize; i++)
377+
for (int i = 0; i < ConcurrentLfu<int, int>.DefaultBufferSize; i++)
378378
{
379379
scheduler.RunCount.Should().Be(1);
380380
cache.GetOrAdd(1, k => k);
@@ -389,30 +389,29 @@ public void ReadSchedulesMaintenanceWhenBufferIsFull()
389389
public void WhenReadBufferIsFullReadsAreDropped()
390390
{
391391
var scheduler = new TestScheduler();
392-
cache = new ConcurrentLfu<int, int>(1, 20, scheduler, EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
392+
cache = new ConcurrentLfu<int, int>(1, 20, scheduler, EqualityComparer<int>.Default);
393393

394394
cache.GetOrAdd(1, k => k);
395395
scheduler.RunCount.Should().Be(1);
396396
cache.PendingMaintenance();
397397

398-
for (int i = 0; i < LfuBufferSize.DefaultBufferSize * 2; i++)
398+
for (int i = 0; i < ConcurrentLfu<int, int>.DefaultBufferSize * 2; i++)
399399
{
400400
cache.GetOrAdd(1, k => k);
401401
}
402402

403403
cache.PendingMaintenance();
404404

405-
cache.Metrics.Value.Hits.Should().Be(LfuBufferSize.DefaultBufferSize);
405+
cache.Metrics.Value.Hits.Should().Be(ConcurrentLfu<int, int>.DefaultBufferSize);
406406
}
407407

408408
[Fact]
409409
public void WhenWriteBufferIsFullAddDoesMaintenance()
410410
{
411-
var bufferSize = LfuBufferSize.DefaultBufferSize;
411+
var bufferSize = ConcurrentLfu<int, int>.DefaultBufferSize;
412412
var scheduler = new TestScheduler();
413413

414-
var bufferConfig = new LfuBufferSize(new StripedBufferSize(bufferSize, 1));
415-
cache = new ConcurrentLfu<int, int>(1, bufferSize * 2, scheduler, EqualityComparer<int>.Default, bufferConfig);
414+
cache = new ConcurrentLfu<int, int>(1, bufferSize * 2, scheduler, EqualityComparer<int>.Default);
416415

417416
// add an item, flush write buffer
418417
cache.GetOrAdd(-1, k => k);
@@ -439,8 +438,7 @@ public void WhenWriteBufferIsFullUpdatesAreDropped()
439438
int capacity = 20;
440439
var bufferSize = Math.Min(BitOps.CeilingPowerOfTwo(capacity), 128);
441440
var scheduler = new TestScheduler();
442-
var bufferConfig = new LfuBufferSize(new StripedBufferSize(bufferSize, 1));
443-
cache = new ConcurrentLfu<int, int>(1, capacity, scheduler, EqualityComparer<int>.Default, bufferConfig);
441+
cache = new ConcurrentLfu<int, int>(1, capacity, scheduler, EqualityComparer<int>.Default);
444442

445443
cache.GetOrAdd(1, k => k);
446444
scheduler.RunCount.Should().Be(1);
@@ -572,7 +570,7 @@ public void WhenItemIsRemovedItIsRemoved()
572570
[Fact]
573571
public void WhenItemIsRemovedItIsDisposed()
574572
{
575-
var dcache = new ConcurrentLfu<int, DisposableItem>(1, 20, new BackgroundThreadScheduler(), EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
573+
var dcache = new ConcurrentLfu<int, DisposableItem>(1, 20, new BackgroundThreadScheduler(), EqualityComparer<int>.Default);
576574
var disposable = new DisposableItem();
577575

578576
dcache.GetOrAdd(1, k => disposable);
@@ -661,7 +659,7 @@ public void TrimRemovesNItems()
661659
public void TrimWhileItemsInWriteBufferRemovesNItems()
662660
{
663661
// null scheduler == no maintenance, all writes fit in buffer
664-
cache = new ConcurrentLfu<int, int>(1, 20, new NullScheduler(), EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
662+
cache = new ConcurrentLfu<int, int>(1, 20, new NullScheduler(), EqualityComparer<int>.Default);
665663

666664
for (int i = 0; i < 25; i++)
667665
{
@@ -699,7 +697,7 @@ public void VerifyHitsWithBackgroundScheduler()
699697
public void VerifyHitsWithThreadPoolScheduler()
700698
{
701699
// when running all tests in parallel, sample count drops significantly: set low bar for stability.
702-
cache = new ConcurrentLfu<int, int>(1, 20, new ThreadPoolScheduler(), EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
700+
cache = new ConcurrentLfu<int, int>(1, 20, new ThreadPoolScheduler(), EqualityComparer<int>.Default);
703701
VerifyHits(iterations: 10000000, minSamples: 500000);
704702
}
705703

@@ -709,7 +707,7 @@ public void VerifyHitsWithThreadPoolScheduler()
709707
[Fact]
710708
public void VerifyHitsWithNullScheduler()
711709
{
712-
cache = new ConcurrentLfu<int, int>(1, 20, new NullScheduler(), EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
710+
cache = new ConcurrentLfu<int, int>(1, 20, new NullScheduler(), EqualityComparer<int>.Default);
713711
VerifyHits(iterations: 10000000, minSamples: -1);
714712
}
715713

@@ -720,12 +718,12 @@ public void VerifyHitsWithNullScheduler()
720718
[Fact]
721719
public void VerifyHitsWithForegroundScheduler()
722720
{
723-
cache = new ConcurrentLfu<int, int>(1, 20, new ForegroundScheduler(), EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
721+
cache = new ConcurrentLfu<int, int>(1, 20, new ForegroundScheduler(), EqualityComparer<int>.Default);
724722

725723
// Note: TryAdd will drop 1 read per full read buffer, since TryAdd will return false
726724
// before TryScheduleDrain is called. This serves as sanity check.
727725
int iterations = 10000000;
728-
int dropped = iterations / LfuBufferSize.DefaultBufferSize;
726+
int dropped = iterations / ConcurrentLfu<int, int>.DefaultBufferSize;
729727

730728
this.output.WriteLine($"Will drop {dropped} reads.");
731729

@@ -735,8 +733,7 @@ public void VerifyHitsWithForegroundScheduler()
735733
[Fact]
736734
public void VerifyMisses()
737735
{
738-
cache = new ConcurrentLfu<int, int>(1, 20, new BackgroundThreadScheduler(), EqualityComparer<int>.Default,
739-
new LfuBufferSize(new StripedBufferSize(1, 1)));
736+
cache = new ConcurrentLfu<int, int>(1, 20, new BackgroundThreadScheduler(), EqualityComparer<int>.Default);
740737

741738
int iterations = 100000;
742739
Func<int, int> func = x => x;
@@ -770,8 +767,7 @@ public void VerifyMisses()
770767
public async Task ThreadedVerifyMisses()
771768
{
772769
// buffer size is 1, this will cause dropped writes on some threads where the buffer is full
773-
cache = new ConcurrentLfu<int, int>(1, 20, new NullScheduler(), EqualityComparer<int>.Default,
774-
new LfuBufferSize(new StripedBufferSize(1, 1)));
770+
cache = new ConcurrentLfu<int, int>(1, 20, new NullScheduler(), EqualityComparer<int>.Default);
775771

776772
int threads = 4;
777773
int iterations = 100000;

BitFaster.Caching.UnitTests/Lfu/LfuBufferSizeTests.cs

Lines changed: 0 additions & 45 deletions
This file was deleted.

BitFaster.Caching/Buffers/StripedBufferSize.cs

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)