Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions BitFaster.Caching.Benchmarks/Lfu/LfuJustGetOrAdd.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ public class LfuJustGetOrAdd

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

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

[GlobalSetup]
public void GlobalSetup()
Expand Down
2 changes: 1 addition & 1 deletion BitFaster.Caching.Benchmarks/Lru/LruJustGetOrAdd.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public class LruJustGetOrAdd
private static readonly ICache<int, int> atomicFastLru = new ConcurrentLruBuilder<int, int>().WithConcurrencyLevel(8).WithCapacity(9).WithAtomicGetOrAdd().Build();

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


private static readonly int key = 1;
Expand Down
5 changes: 1 addition & 4 deletions BitFaster.Caching.HitRateAnalysis/Analysis.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BitFaster.Caching.Lfu;
using BitFaster.Caching.Lru;
using BitFaster.Caching.Scheduler;
Expand All @@ -22,7 +19,7 @@ public Analysis(int cacheSize)
{
concurrentLru = new ConcurrentLru<K, int>(1, cacheSize, EqualityComparer<K>.Default);
classicLru = new ClassicLru<K, int>(1, cacheSize, EqualityComparer<K>.Default);
concurrentLfu = new ConcurrentLfu<K, int>(1, cacheSize, new ForegroundScheduler(), EqualityComparer<K>.Default, LfuBufferSize.Default(1, 128));
concurrentLfu = new ConcurrentLfu<K, int>(1, cacheSize, new ForegroundScheduler(), EqualityComparer<K>.Default);
}

public int CacheSize => concurrentLru.Capacity;
Expand Down
5 changes: 2 additions & 3 deletions BitFaster.Caching.ThroughputAnalysis/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class Program
const double s = 0.86;
const int n = 500;
static int capacity = 500;
const int maxThreads = 64;
const int maxThreads = 52;
const int sampleCount = 2000;
const int repeatCount = 400;

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


DataRow classicLru = resultTable.NewRow();
DataRow memoryCache = resultTable.NewRow();
DataRow concurrentLru = resultTable.NewRow();
Expand Down Expand Up @@ -102,7 +101,7 @@ static void Main(string[] args)
for (int i = 0; i < warmup + runs; i++)
{
var scheduler = new BackgroundThreadScheduler();
results[i] = MeasureThroughput(new ConcurrentLfu<int, int>(concurrencyLevel: tc, capacity: capacity, scheduler: scheduler, EqualityComparer<int>.Default, LfuBufferSize.Default(concurrencyLevel: tc, capacity: capacity)), tc);
results[i] = MeasureThroughput(new ConcurrentLfu<int, int>(concurrencyLevel: tc, capacity: capacity, scheduler: scheduler, EqualityComparer<int>.Default), tc);
scheduler.Dispose();
}
avg = AverageLast(results, runs) / 1000000;
Expand Down
42 changes: 0 additions & 42 deletions BitFaster.Caching.UnitTests/Buffers/StripedBufferSizeTests.cs

This file was deleted.

11 changes: 0 additions & 11 deletions BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuBuilderTests.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using BitFaster.Caching.Atomic;
using BitFaster.Caching.Buffers;
using BitFaster.Caching.Lfu;
using BitFaster.Caching.Scheduler;
using FluentAssertions;
Expand Down Expand Up @@ -53,16 +52,6 @@ public void TestComparer()
lfu.TryGet("A", out var value).Should().BeTrue();
}

[Fact]
public void TestBufferConfiguraiton()
{
ICache<string, int> lfu = new ConcurrentLfuBuilder<string, int>()
.WithBufferConfiguration(new LfuBufferSize(
new StripedBufferSize(128, 2)
))
.Build();
}

// 1
[Fact]
public void WithScopedValues()
Expand Down
42 changes: 19 additions & 23 deletions BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class ConcurrentLfuTests
{
private readonly ITestOutputHelper output;

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

public ConcurrentLfuTests(ITestOutputHelper output)
Expand Down Expand Up @@ -75,7 +75,7 @@ public void WhenItemsAddedExceedsCapacityItemsAreDiscarded()
[Fact]
public void WhenItemIsEvictedItIsDisposed()
{
var dcache = new ConcurrentLfu<int, DisposableItem>(1, 20, new BackgroundThreadScheduler(), EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
var dcache = new ConcurrentLfu<int, DisposableItem>(1, 20, new BackgroundThreadScheduler(), EqualityComparer<int>.Default);
var disposables = new DisposableItem[25];

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

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

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

for (int i = 0; i < LfuBufferSize.DefaultBufferSize; i++)
for (int i = 0; i < ConcurrentLfu<int, int>.DefaultBufferSize; i++)
{
scheduler.RunCount.Should().Be(1);
cache.GetOrAdd(1, k => k);
Expand All @@ -389,30 +389,29 @@ public void ReadSchedulesMaintenanceWhenBufferIsFull()
public void WhenReadBufferIsFullReadsAreDropped()
{
var scheduler = new TestScheduler();
cache = new ConcurrentLfu<int, int>(1, 20, scheduler, EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
cache = new ConcurrentLfu<int, int>(1, 20, scheduler, EqualityComparer<int>.Default);

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

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

cache.PendingMaintenance();

cache.Metrics.Value.Hits.Should().Be(LfuBufferSize.DefaultBufferSize);
cache.Metrics.Value.Hits.Should().Be(ConcurrentLfu<int, int>.DefaultBufferSize);
}

[Fact]
public void WhenWriteBufferIsFullAddDoesMaintenance()
{
var bufferSize = LfuBufferSize.DefaultBufferSize;
var bufferSize = ConcurrentLfu<int, int>.DefaultBufferSize;
var scheduler = new TestScheduler();

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

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

cache.GetOrAdd(1, k => k);
scheduler.RunCount.Should().Be(1);
Expand Down Expand Up @@ -572,7 +570,7 @@ public void WhenItemIsRemovedItIsRemoved()
[Fact]
public void WhenItemIsRemovedItIsDisposed()
{
var dcache = new ConcurrentLfu<int, DisposableItem>(1, 20, new BackgroundThreadScheduler(), EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
var dcache = new ConcurrentLfu<int, DisposableItem>(1, 20, new BackgroundThreadScheduler(), EqualityComparer<int>.Default);
var disposable = new DisposableItem();

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

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

Expand All @@ -709,7 +707,7 @@ public void VerifyHitsWithThreadPoolScheduler()
[Fact]
public void VerifyHitsWithNullScheduler()
{
cache = new ConcurrentLfu<int, int>(1, 20, new NullScheduler(), EqualityComparer<int>.Default, LfuBufferSize.Default(1, 128));
cache = new ConcurrentLfu<int, int>(1, 20, new NullScheduler(), EqualityComparer<int>.Default);
VerifyHits(iterations: 10000000, minSamples: -1);
}

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

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

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

Expand All @@ -735,8 +733,7 @@ public void VerifyHitsWithForegroundScheduler()
[Fact]
public void VerifyMisses()
{
cache = new ConcurrentLfu<int, int>(1, 20, new BackgroundThreadScheduler(), EqualityComparer<int>.Default,
new LfuBufferSize(new StripedBufferSize(1, 1)));
cache = new ConcurrentLfu<int, int>(1, 20, new BackgroundThreadScheduler(), EqualityComparer<int>.Default);

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

int threads = 4;
int iterations = 100000;
Expand Down
45 changes: 0 additions & 45 deletions BitFaster.Caching.UnitTests/Lfu/LfuBufferSizeTests.cs

This file was deleted.

41 changes: 0 additions & 41 deletions BitFaster.Caching/Buffers/StripedBufferSize.cs

This file was deleted.

Loading