44using System . Linq ;
55using System . Text ;
66using System . Threading . Tasks ;
7+ using BitFaster . Caching . Lfu ;
78using BitFaster . Caching . Lru ;
89using BitFaster . Caching . ThroughputAnalysis ;
910using MathNet . Numerics ;
@@ -74,9 +75,13 @@ public static void Run()
7475
7576 var concurrentLru = new ConcurrentLru < int , int > ( 1 , cacheSize , EqualityComparer < int > . Default ) ;
7677 var classicLru = new ClassicLru < int , int > ( 1 , cacheSize , EqualityComparer < int > . Default ) ;
78+ var memCache = new MemoryCacheAdaptor < int , int > ( cacheSize ) ;
79+ var concurrentLfu = new ConcurrentLfu < int , int > ( cacheSize ) ;
7780
7881 var concurrentLruScan = new ConcurrentLru < int , int > ( 1 , cacheSize , EqualityComparer < int > . Default ) ;
7982 var classicLruScan = new ClassicLru < int , int > ( 1 , cacheSize , EqualityComparer < int > . Default ) ;
83+ var memCacheScan = new MemoryCacheAdaptor < int , int > ( cacheSize ) ;
84+ var concurrentLfuScan = new ConcurrentLfu < int , int > ( cacheSize ) ;
8085
8186 var d = a . s == 0.5 ? 0 : 1 ;
8287
@@ -88,6 +93,14 @@ public static void Run()
8893 lruSw . Stop ( ) ;
8994 Console . WriteLine ( $ "concurrentLru size={ cacheSize } took { lruSw . Elapsed } .") ;
9095
96+ var lfuSw = Stopwatch . StartNew ( ) ;
97+ for ( int i = 0 ; i < sampleCount ; i ++ )
98+ {
99+ concurrentLfu . GetOrAdd ( zipdfDistribution [ d ] [ i ] , func ) ;
100+ }
101+ lfuSw . Stop ( ) ;
102+ Console . WriteLine ( $ "concurrentLfu size={ cacheSize } took { lfuSw . Elapsed } .") ;
103+
91104 var clruSw = Stopwatch . StartNew ( ) ;
92105 for ( int i = 0 ; i < sampleCount ; i ++ )
93106 {
@@ -96,6 +109,14 @@ public static void Run()
96109 clruSw . Stop ( ) ;
97110 Console . WriteLine ( $ "classic lru size={ cacheSize } took { clruSw . Elapsed } .") ;
98111
112+ var memSw = Stopwatch . StartNew ( ) ;
113+ for ( int i = 0 ; i < sampleCount ; i ++ )
114+ {
115+ memCache . GetOrAdd ( zipdfDistribution [ d ] [ i ] , func ) ;
116+ }
117+ memSw . Stop ( ) ;
118+ Console . WriteLine ( $ "memcache size={ cacheSize } took { memSw . Elapsed } .") ;
119+
99120 var lruSwScan = Stopwatch . StartNew ( ) ;
100121 for ( int i = 0 ; i < sampleCount ; i ++ )
101122 {
@@ -105,6 +126,15 @@ public static void Run()
105126 lruSwScan . Stop ( ) ;
106127 Console . WriteLine ( $ "concurrentLruScan lru size={ cacheSize } took { lruSwScan . Elapsed } .") ;
107128
129+ var lfuSwScan = Stopwatch . StartNew ( ) ;
130+ for ( int i = 0 ; i < sampleCount ; i ++ )
131+ {
132+ concurrentLfuScan . GetOrAdd ( zipdfDistribution [ d ] [ i ] , func ) ;
133+ concurrentLfuScan . GetOrAdd ( i % n , func ) ;
134+ }
135+ lfuSwScan . Stop ( ) ;
136+ Console . WriteLine ( $ "concurrentLfuScan lru size={ cacheSize } took { lfuSwScan . Elapsed } .") ;
137+
108138 var clruSwScan = Stopwatch . StartNew ( ) ;
109139 for ( int i = 0 ; i < sampleCount ; i ++ )
110140 {
@@ -114,6 +144,15 @@ public static void Run()
114144 clruSwScan . Stop ( ) ;
115145 Console . WriteLine ( $ "classicLruScan lru size={ cacheSize } took { clruSwScan . Elapsed } .") ;
116146
147+ var memSwScan = Stopwatch . StartNew ( ) ;
148+ for ( int i = 0 ; i < sampleCount ; i ++ )
149+ {
150+ memCacheScan . GetOrAdd ( zipdfDistribution [ d ] [ i ] , func ) ;
151+ memCacheScan . GetOrAdd ( i % n , func ) ;
152+ }
153+ memSwScan . Stop ( ) ;
154+ Console . WriteLine ( $ "memcacheScan size={ cacheSize } took { memSwScan . Elapsed } .") ;
155+
117156 results . Add ( new AnalysisResult
118157 {
119158 Cache = "ClassicLru" ,
@@ -126,6 +165,18 @@ public static void Run()
126165 Duration = clruSw . Elapsed ,
127166 } ) ;
128167
168+ results . Add ( new AnalysisResult
169+ {
170+ Cache = "MemoryCache" ,
171+ N = a . N ,
172+ s = a . s ,
173+ CacheSizePercent = a . CacheSizePercent * 100.0 ,
174+ Samples = a . Samples ,
175+ IsScan = false ,
176+ HitRatio = memCache . Metrics . Value . HitRatio * 100.0 ,
177+ Duration = memSw . Elapsed ,
178+ } ) ;
179+
129180 results . Add ( new AnalysisResult
130181 {
131182 Cache = "ConcurrentLru" ,
@@ -138,6 +189,18 @@ public static void Run()
138189 Duration = lruSw . Elapsed ,
139190 } ) ;
140191
192+ results . Add ( new AnalysisResult
193+ {
194+ Cache = "ConcurrentLfu" ,
195+ N = a . N ,
196+ s = a . s ,
197+ CacheSizePercent = a . CacheSizePercent * 100.0 ,
198+ Samples = a . Samples ,
199+ IsScan = false ,
200+ HitRatio = concurrentLfu . Metrics . Value . HitRatio * 100.0 ,
201+ Duration = lfuSw . Elapsed ,
202+ } ) ;
203+
141204 results . Add ( new AnalysisResult
142205 {
143206 Cache = "ClassicLru" ,
@@ -150,6 +213,18 @@ public static void Run()
150213 Duration = clruSwScan . Elapsed ,
151214 } ) ;
152215
216+ results . Add ( new AnalysisResult
217+ {
218+ Cache = "MemoryCache" ,
219+ N = a . N ,
220+ s = a . s ,
221+ CacheSizePercent = a . CacheSizePercent * 100.0 ,
222+ Samples = a . Samples ,
223+ IsScan = true ,
224+ HitRatio = memCacheScan . Metrics . Value . HitRatio * 100.0 ,
225+ Duration = memSwScan . Elapsed ,
226+ } ) ;
227+
153228 results . Add ( new AnalysisResult
154229 {
155230 Cache = "ConcurrentLru" ,
@@ -161,6 +236,18 @@ public static void Run()
161236 HitRatio = concurrentLruScan . Metrics . Value . HitRatio * 100.0 ,
162237 Duration = lruSwScan . Elapsed ,
163238 } ) ;
239+
240+ results . Add ( new AnalysisResult
241+ {
242+ Cache = "ConcurrentLfu" ,
243+ N = a . N ,
244+ s = a . s ,
245+ CacheSizePercent = a . CacheSizePercent * 100.0 ,
246+ Samples = a . Samples ,
247+ IsScan = true ,
248+ HitRatio = concurrentLfuScan . Metrics . Value . HitRatio * 100.0 ,
249+ Duration = lfuSwScan . Elapsed ,
250+ } ) ;
164251 }
165252
166253 results . WriteToConsole ( ) ;
0 commit comments