@@ -16,7 +16,8 @@ use std::sync::Arc;
16
16
17
17
use ahash:: RandomState ;
18
18
use foyer_memory:: {
19
- Cache , DefaultCacheEventListener , FifoCacheConfig , FifoConfig , LfuCacheConfig , LfuConfig , LruCacheConfig , LruConfig ,
19
+ Cache , DefaultCacheEventListener , FifoCacheConfig , FifoConfig , LfuCacheConfig , LfuConfig , LruCacheConfig ,
20
+ LruConfig , S3FifoCacheConfig , S3FifoConfig ,
20
21
} ;
21
22
use rand:: { distributions:: Distribution , thread_rng} ;
22
23
@@ -32,32 +33,32 @@ const OBJECT_POOL_CAPACITY: usize = 16;
32
33
inspired by pingora/tinyufo/benches/bench_hit_ratio.rs
33
34
cargo bench --bench bench_hit_ratio
34
35
35
- zif_exp, cache_size fifo lru lfu moka
36
- 0.90, 0.005 16.26 % 19.22% 32.38 % 33.46 %
37
- 0.90, 0.01 22.55% 26.21 % 38.55 % 37.93 %
38
- 0.90, 0.05 41.10 % 45.60 % 55.45 % 55.26 %
39
- 0.90, 0.1 51.11 % 55.72 % 63.83 % 64.21 %
40
- 0.90, 0.25 66.81% 71.17% 76.21% 77.14 %
41
- 1.00, 0.005 26.64 % 31.08 % 44.14 % 45.61 %
42
- 1.00, 0.01 34.37 % 39.13 % 50.60 % 50.67 %
43
- 1.00, 0.05 54.06 % 58.79 % 66.79% 66.99 %
44
- 1.00, 0.1 63.12 % 67.58 % 73.92% 74.38%
45
- 1.00, 0.25 76.14 % 79.92 % 83.61 % 84.33 %
46
- 1.05, 0.005 32.63 % 37.68 % 50.24 % 51.77 %
47
- 1.05, 0.01 40.95 % 46.09 % 56.75 % 57.15 %
48
- 1.05, 0.05 60.47 % 65.06 % 72.07 % 72.36 %
49
- 1.05, 0.1 68.96 % 73.15 % 78.52 % 78.96 %
50
- 1.05, 0.25 80.42 % 83.76 % 86.79 % 87.42%
51
- 1.10, 0.005 39.02% 44.52 % 56.29 % 57.90%
52
- 1.10, 0.01 47.66 % 52.99 % 62.64 % 63.23 %
53
- 1.10, 0.05 66.60 % 70.95% 76.94 % 77.25 %
54
- 1.10, 0.1 74.26 % 78.09 % 82.56 % 82.93 %
55
- 1.10, 0.25 84.15 % 87.06 % 89.54 % 90.05 %
56
- 1.50, 0.005 81.19 % 85.28 % 88.91 % 89.94 %
57
- 1.50, 0.01 86.91% 89.87% 92.24 % 92.78 %
58
- 1.50, 0.05 94.75 % 96.04% 96.95 % 97.07%
59
- 1.50, 0.1 96.65% 97.51 % 98.06% 98.15%
60
- 1.50, 0.25 98.35 % 98.81% 99.04% 99.09%
36
+ zif_exp, cache_size fifo lru lfu s3fifo moka
37
+ 0.90, 0.005 16.24 % 19.22% 32.37 % 32.39% 33.50 %
38
+ 0.90, 0.01 22.55% 26.20 % 38.54 % 39.20% 37.92 %
39
+ 0.90, 0.05 41.05 % 45.56 % 55.37 % 56.63% 55.25 %
40
+ 0.90, 0.1 51.06 % 55.68 % 63.82 % 65.06% 64.20 %
41
+ 0.90, 0.25 66.81% 71.17% 76.21% 77.26% 77.12 %
42
+ 1.00, 0.005 26.62 % 31.10 % 44.16 % 44.15% 45.62 %
43
+ 1.00, 0.01 34.38 % 39.17 % 50.63 % 51.29% 50.72 %
44
+ 1.00, 0.05 54.04 % 58.76 % 66.79% 67.85% 66.89 %
45
+ 1.00, 0.1 63.15 % 67.60 % 73.93% 74 .92% 74.38%
46
+ 1.00, 0.25 76.18 % 79.95 % 83.63 % 84.39% 84.38 %
47
+ 1.05, 0.005 32.67 % 37.71 % 50.26 % 50.21% 51.85 %
48
+ 1.05, 0.01 40.97 % 46.10 % 56.74 % 57.40% 57.09 %
49
+ 1.05, 0.05 60.44 % 65.03 % 72.04 % 73.02% 72.28 %
50
+ 1.05, 0.1 68.93 % 73.12 % 78.49 % 79.37% 79.00 %
51
+ 1.05, 0.25 80.38 % 83.73 % 86.78 % 87.42% 87.41 %
52
+ 1.10, 0.005 39.02% 44.50 % 56.26% 56.20 % 57.90%
53
+ 1.10, 0.01 47.60 % 52.93 % 62.61 % 63.24% 63.05 %
54
+ 1.10, 0.05 66.59 % 70.95% 76.92 % 77.76% 77.27 %
55
+ 1.10, 0.1 74.24 % 78.07 % 82.54 % 83.28% 83.00 %
56
+ 1.10, 0.25 84.18 % 87.10 % 89.57 % 90.06% 90.08 %
57
+ 1.50, 0.005 81.17 % 85.27 % 88.90 % 89.10% 89.89 %
58
+ 1.50, 0.01 86.91% 89.87% 92.25 % 92.56% 92.79 %
59
+ 1.50, 0.05 94.77 % 96.04% 96.96% 97.10 % 97.07%
60
+ 1.50, 0.1 96.65% 97.50 % 98.06% 98.14 % 98.15%
61
+ 1.50, 0.25 98.36 % 98.81% 99.04% 99.06 % 99.09%
61
62
*/
62
63
fn cache_hit ( cache : Arc < Cache < CacheKey , CacheValue > > , keys : Arc < Vec < CacheKey > > ) -> f64 {
63
64
let mut hit = 0 ;
@@ -131,6 +132,21 @@ fn new_lfu_cache(capacity: usize) -> Arc<Cache<CacheKey, CacheValue>> {
131
132
Arc :: new ( Cache :: lfu ( config) )
132
133
}
133
134
135
+ fn new_s3fifo_cache ( capacity : usize ) -> Arc < Cache < CacheKey , CacheValue > > {
136
+ let config = S3FifoCacheConfig {
137
+ capacity,
138
+ shards : SHARDS ,
139
+ eviction_config : S3FifoConfig {
140
+ small_queue_capacity_ratio : 0.1 ,
141
+ } ,
142
+ object_pool_capacity : OBJECT_POOL_CAPACITY ,
143
+ hash_builder : RandomState :: default ( ) ,
144
+ event_listener : DefaultCacheEventListener :: default ( ) ,
145
+ } ;
146
+
147
+ Arc :: new ( Cache :: s3fifo ( config) )
148
+ }
149
+
134
150
fn bench_one ( zif_exp : f64 , cache_size_percent : f64 ) {
135
151
print ! ( "{zif_exp:.2}, {cache_size_percent:4}\t \t \t " ) ;
136
152
let mut rng = thread_rng ( ) ;
@@ -141,6 +157,7 @@ fn bench_one(zif_exp: f64, cache_size_percent: f64) {
141
157
let fifo_cache = new_fifo_cache ( cache_size) ;
142
158
let lru_cache = new_lru_cache ( cache_size) ;
143
159
let lfu_cache = new_lfu_cache ( cache_size) ;
160
+ let s3fifo_cache = new_s3fifo_cache ( cache_size) ;
144
161
let moka_cache = moka:: sync:: Cache :: new ( cache_size as u64 ) ;
145
162
146
163
let mut keys = Vec :: with_capacity ( ITERATIONS ) ;
@@ -170,6 +187,12 @@ fn bench_one(zif_exp: f64, cache_size_percent: f64) {
170
187
move || cache_hit ( cache, keys)
171
188
} ) ;
172
189
190
+ let s3fifo_cache_hit_handle = std:: thread:: spawn ( {
191
+ let cache = s3fifo_cache. clone ( ) ;
192
+ let keys = keys. clone ( ) ;
193
+ move || cache_hit ( cache, keys)
194
+ } ) ;
195
+
173
196
let moka_cache_hit_handle = std:: thread:: spawn ( {
174
197
let cache = moka_cache. clone ( ) ;
175
198
let keys = keys. clone ( ) ;
@@ -179,16 +202,18 @@ fn bench_one(zif_exp: f64, cache_size_percent: f64) {
179
202
let fifo_hit_ratio = fifo_cache_hit_handle. join ( ) . unwrap ( ) ;
180
203
let lru_hit_ratio = lru_cache_hit_handle. join ( ) . unwrap ( ) ;
181
204
let lfu_hit_ratio = lfu_cache_hit_handle. join ( ) . unwrap ( ) ;
205
+ let s3fifo_hit_ratio = s3fifo_cache_hit_handle. join ( ) . unwrap ( ) ;
182
206
let moka_hit_ratio = moka_cache_hit_handle. join ( ) . unwrap ( ) ;
183
207
184
208
print ! ( "{:.2}%\t \t " , fifo_hit_ratio * 100.0 ) ;
185
209
print ! ( "{:.2}%\t \t " , lru_hit_ratio * 100.0 ) ;
186
210
print ! ( "{:.2}%\t \t " , lfu_hit_ratio * 100.0 ) ;
211
+ print ! ( "{:.2}%\t \t " , s3fifo_hit_ratio * 100.0 ) ;
187
212
println ! ( "{:.2}%" , moka_hit_ratio * 100.0 ) ;
188
213
}
189
214
190
215
fn bench_zipf_hit ( ) {
191
- println ! ( "zif_exp, cache_size\t \t fifo\t \t lru\t \t lfu\t \t moka" ) ;
216
+ println ! ( "zif_exp, cache_size\t \t fifo\t \t lru\t \t lfu\t \t s3fifo \t \ t moka" ) ;
192
217
for zif_exp in [ 0.9 , 1.0 , 1.05 , 1.1 , 1.5 ] {
193
218
for cache_capacity in [ 0.005 , 0.01 , 0.05 , 0.1 , 0.25 ] {
194
219
bench_one ( zif_exp, cache_capacity) ;
0 commit comments