Skip to content

Commit 37749c2

Browse files
authored
compare hit rate (#29)
* compare hit rate * cleanup
1 parent 76bebfc commit 37749c2

File tree

6 files changed

+177
-62
lines changed

6 files changed

+177
-62
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace BitFaster.Caching.HitRateAnalysis
6+
{
7+
public class Analysis
8+
{
9+
public int N { get; set; }
10+
11+
public double s { get; set; }
12+
13+
public int Samples { get; set; }
14+
15+
public double CacheSizePercent { get; set; }
16+
17+
public void WriteSummaryToConsole()
18+
{
19+
Console.WriteLine($"Analyzing with N={N}, s={s}, Samples={Samples}, Cache Size ={CacheSizePercent*100.0}%");
20+
}
21+
}
22+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Globalization;
4+
using System.IO;
5+
using System.Text;
6+
using ConsoleTables;
7+
using CsvHelper;
8+
9+
namespace BitFaster.Caching.HitRateAnalysis
10+
{
11+
public class AnalysisResult
12+
{
13+
public string Cache { get; set; }
14+
15+
public int N { get; set; }
16+
17+
public double s { get; set; }
18+
19+
public int Samples { get; set; }
20+
21+
public double CacheSizePercent { get; set; }
22+
23+
public double HitRatio { get; set; }
24+
25+
public static void WriteToFile(string path, IEnumerable<AnalysisResult> results)
26+
{
27+
using (var writer = new StreamWriter(path))
28+
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
29+
{
30+
csv.WriteRecords(results);
31+
}
32+
}
33+
34+
public static void WriteToConsole(IEnumerable<AnalysisResult> results)
35+
{
36+
ConsoleTable
37+
.From<AnalysisResult>(results)
38+
.Configure(o => o.NumberAlignment = Alignment.Right)
39+
.Write(Format.Alternative);
40+
}
41+
}
42+
}

BitFaster.Sampling/BitFaster.Sampling.csproj renamed to BitFaster.Caching.HitRateAnalysis/BitFaster.Caching.HitRateAnalysis.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
</PropertyGroup>
1111

1212
<ItemGroup>
13+
<PackageReference Include="ConsoleTables" Version="2.4.1" />
14+
<PackageReference Include="CsvHelper" Version="15.0.5" />
1315
<PackageReference Include="MathNet.Numerics" Version="4.11.0" />
1416
</ItemGroup>
1517

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using BitFaster.Caching.HitRateAnalysis;
4+
using BitFaster.Caching.Lru;
5+
using MathNet.Numerics;
6+
using MathNet.Numerics.Distributions;
7+
8+
namespace BitFaster.Sampling
9+
{
10+
class Program
11+
{
12+
// Test methodolopy from 2Q paper:
13+
// http://www.vldb.org/conf/1994/P439.PDF
14+
15+
// s = 0.5 and s = 0.86.
16+
// If there are N items, the probability of accessing an item numbered i or less is (i / N)^s.
17+
// A setting of (s = 0.86 gives an 80 / 20 distribution, while a setting of (s = 0.5 give a less skewed
18+
// distribution (about 45 / 20).
19+
20+
// Took 1 million samples
21+
const int sampleCount = 1000000;
22+
23+
// Simulated a database of 50,000 pages and
24+
// buffer sizes ranging from 2,500 (5%) items to 20,000
25+
// (40%) items.
26+
const int n = 50000;
27+
28+
static void Main(string[] args)
29+
{
30+
double[] sValues = { 0.5, 0.86 };
31+
32+
// % of total number of items
33+
double[] cacheSizes = { 0.025, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4 };
34+
35+
List<Analysis> analysis = new List<Analysis>();
36+
37+
foreach (var sValue in sValues)
38+
{
39+
foreach (var cacheSize in cacheSizes)
40+
{
41+
analysis.Add(new Analysis {
42+
N = n,
43+
s = sValue,
44+
Samples = sampleCount,
45+
CacheSizePercent = cacheSize
46+
});
47+
}
48+
}
49+
50+
int[][] zipdfDistribution = new int[sValues.Length][];
51+
52+
for (int i = 0; i < sValues.Length; i++)
53+
{
54+
Console.WriteLine($"Generating Zipfan distribution with {sampleCount} samples, s = {sValues[i]}, N = {n}");
55+
zipdfDistribution[i] = new int[sampleCount];
56+
Zipf.Samples(zipdfDistribution[i], sValues[i], n);
57+
}
58+
59+
List<AnalysisResult> results = new List<AnalysisResult>();
60+
Func<int, int> func = x => x;
61+
62+
foreach (var a in analysis)
63+
{
64+
a.WriteSummaryToConsole();
65+
66+
int cacheSize = (int)(a.N * a.CacheSizePercent);
67+
68+
var concurrentLru = new ConcurrentLru<int, int>(1, cacheSize, EqualityComparer<int>.Default);
69+
var classicLru = new ClassicLru<int, int>(1, cacheSize, EqualityComparer<int>.Default);
70+
71+
var d = a.s == 0.5 ? 0 : 1;
72+
73+
for (int i = 0; i < sampleCount; i++)
74+
{
75+
concurrentLru.GetOrAdd(zipdfDistribution[d][i], func);
76+
classicLru.GetOrAdd(zipdfDistribution[d][i], func);
77+
}
78+
79+
results.Add(new AnalysisResult
80+
{
81+
Cache = "ClassicLru",
82+
N = a.N,
83+
s = a.s,
84+
CacheSizePercent = a.CacheSizePercent * 100.0,
85+
Samples = a.Samples,
86+
HitRatio = classicLru.HitRatio * 100.0,
87+
});
88+
89+
results.Add(new AnalysisResult
90+
{
91+
Cache = "ConcurrentLru",
92+
N = a.N,
93+
s = a.s,
94+
CacheSizePercent = a.CacheSizePercent * 100.0,
95+
Samples = a.Samples,
96+
HitRatio = concurrentLru.HitRatio * 100.0,
97+
});
98+
}
99+
100+
AnalysisResult.WriteToConsole(results);
101+
AnalysisResult.WriteToFile("results.csv", results);
102+
103+
Console.ReadLine();
104+
}
105+
}
106+
}

BitFaster.Sampling/Program.cs

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

BitFaster.sln

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BitFaster.Caching.UnitTests
1414
EndProject
1515
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BitFaster.Caching.Benchmarks", "BitFaster.Caching.Benchmarks\BitFaster.Caching.Benchmarks.csproj", "{8CDE3FA5-B08A-4375-9EF0-F1F044B841C4}"
1616
EndProject
17-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BitFaster.Sampling", "BitFaster.Sampling\BitFaster.Sampling.csproj", "{EAAE8DD3-EA1C-4BDF-920B-A0C858E853CB}"
17+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BitFaster.Caching.HitRateAnalysis", "BitFaster.Caching.HitRateAnalysis\BitFaster.Caching.HitRateAnalysis.csproj", "{12AAE7FB-09F5-4A87-838E-891ACEF5722B}"
1818
EndProject
1919
Global
2020
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -34,10 +34,10 @@ Global
3434
{8CDE3FA5-B08A-4375-9EF0-F1F044B841C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
3535
{8CDE3FA5-B08A-4375-9EF0-F1F044B841C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
3636
{8CDE3FA5-B08A-4375-9EF0-F1F044B841C4}.Release|Any CPU.Build.0 = Release|Any CPU
37-
{EAAE8DD3-EA1C-4BDF-920B-A0C858E853CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
38-
{EAAE8DD3-EA1C-4BDF-920B-A0C858E853CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
39-
{EAAE8DD3-EA1C-4BDF-920B-A0C858E853CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
40-
{EAAE8DD3-EA1C-4BDF-920B-A0C858E853CB}.Release|Any CPU.Build.0 = Release|Any CPU
37+
{12AAE7FB-09F5-4A87-838E-891ACEF5722B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
38+
{12AAE7FB-09F5-4A87-838E-891ACEF5722B}.Debug|Any CPU.Build.0 = Debug|Any CPU
39+
{12AAE7FB-09F5-4A87-838E-891ACEF5722B}.Release|Any CPU.ActiveCfg = Release|Any CPU
40+
{12AAE7FB-09F5-4A87-838E-891ACEF5722B}.Release|Any CPU.Build.0 = Release|Any CPU
4141
EndGlobalSection
4242
GlobalSection(SolutionProperties) = preSolution
4343
HideSolutionNode = FALSE

0 commit comments

Comments
 (0)