@@ -251,3 +251,161 @@ public Int32 MassSearch()
251251 return count ;
252252 }
253253}
254+
255+ /// <summary>KV 引擎海量数据基准测试(100万条)</summary>
256+ [ MemoryDiagnoser ]
257+ [ Config ( typeof ( AntiViralConfig ) ) ]
258+ public class KvStoreMassData100wBenchmark
259+ {
260+ private String _storePath = null ! ;
261+ private Byte [ ] _value64 = null ! ;
262+ private Byte [ ] _value1024 = null ! ;
263+
264+ [ GlobalSetup ]
265+ public void Setup ( )
266+ {
267+ _storePath = Path . Combine ( Path . GetTempPath ( ) , $ "NovaBench_KvMass100w_{ Guid . NewGuid ( ) : N} ") ;
268+ Directory . CreateDirectory ( _storePath ) ;
269+ _value64 = new Byte [ 64 ] ;
270+ Random . Shared . NextBytes ( _value64 ) ;
271+ _value1024 = new Byte [ 1024 ] ;
272+ Random . Shared . NextBytes ( _value1024 ) ;
273+ }
274+
275+ [ GlobalCleanup ]
276+ public void Cleanup ( )
277+ {
278+ try { Directory . Delete ( _storePath , true ) ; } catch { }
279+ }
280+
281+ [ Benchmark ( Description = "海量写入100万条(64B)" ) ]
282+ public void MassWrite_64B ( )
283+ {
284+ var kvFile = Path . Combine ( _storePath , $ "mass64_{ Guid . NewGuid ( ) : N} .kvd") ;
285+ using var store = new KvStore ( new DbOptions { DefaultKvTtl = TimeSpan . Zero } , kvFile ) ;
286+ for ( var i = 0 ; i < 1_000_000 ; i ++ )
287+ store . Set ( $ "key:{ i } ", _value64 ) ;
288+ }
289+
290+ [ Benchmark ( Description = "海量写入100万条(1024B)" ) ]
291+ public void MassWrite_1024B ( )
292+ {
293+ var kvFile = Path . Combine ( _storePath , $ "mass1024_{ Guid . NewGuid ( ) : N} .kvd") ;
294+ using var store = new KvStore ( new DbOptions { DefaultKvTtl = TimeSpan . Zero } , kvFile ) ;
295+ for ( var i = 0 ; i < 1_000_000 ; i ++ )
296+ store . Set ( $ "key:{ i } ", _value1024 ) ;
297+ }
298+
299+ [ Benchmark ( Description = "海量写入后读取100万条(64B)" ) ]
300+ public void MassWriteThenRead_64B ( )
301+ {
302+ var kvFile = Path . Combine ( _storePath , $ "massrd64_{ Guid . NewGuid ( ) : N} .kvd") ;
303+ using var store = new KvStore ( new DbOptions { DefaultKvTtl = TimeSpan . Zero } , kvFile ) ;
304+ for ( var i = 0 ; i < 1_000_000 ; i ++ )
305+ store . Set ( $ "key:{ i } ", _value64 ) ;
306+ for ( var i = 0 ; i < 1_000_000 ; i ++ )
307+ store . Get ( $ "key:{ i } ") ;
308+ }
309+
310+ [ Benchmark ( Description = "海量批量写入100万条(SetAll, 64B)" ) ]
311+ public void MassSetAll_64B ( )
312+ {
313+ var kvFile = Path . Combine ( _storePath , $ "massall64_{ Guid . NewGuid ( ) : N} .kvd") ;
314+ using var store = new KvStore ( new DbOptions { DefaultKvTtl = TimeSpan . Zero } , kvFile ) ;
315+ // 分批写入,每批 1000 条
316+ for ( var batch = 0 ; batch < 1000 ; batch ++ )
317+ {
318+ var dict = new Dictionary < String , Byte [ ] ? > ( 1000 ) ;
319+ for ( var i = 0 ; i < 1000 ; i ++ )
320+ dict [ $ "key:{ batch * 1000 + i } "] = _value64 ;
321+ store . SetAll ( dict ) ;
322+ }
323+ }
324+
325+ [ Benchmark ( Description = "海量数据搜索(100万条中搜索)" ) ]
326+ public Int32 MassSearch ( )
327+ {
328+ var kvFile = Path . Combine ( _storePath , $ "masssrc_{ Guid . NewGuid ( ) : N} .kvd") ;
329+ using var store = new KvStore ( new DbOptions { DefaultKvTtl = TimeSpan . Zero } , kvFile ) ;
330+ for ( var i = 0 ; i < 1_000_000 ; i ++ )
331+ store . Set ( $ "key:{ i } ", _value64 ) ;
332+
333+ var count = 0 ;
334+ foreach ( var _ in store . Search ( "key:999*" , 0 , 100 ) )
335+ count ++ ;
336+ return count ;
337+ }
338+ }
339+
340+ /// <summary>KV 引擎海量数据基准测试(1000万条)</summary>
341+ [ MemoryDiagnoser ]
342+ [ Config ( typeof ( AntiViralConfig ) ) ]
343+ public class KvStoreMassData1000wBenchmark
344+ {
345+ private String _storePath = null ! ;
346+ private Byte [ ] _value64 = null ! ;
347+
348+ [ GlobalSetup ]
349+ public void Setup ( )
350+ {
351+ _storePath = Path . Combine ( Path . GetTempPath ( ) , $ "NovaBench_KvMass1000w_{ Guid . NewGuid ( ) : N} ") ;
352+ Directory . CreateDirectory ( _storePath ) ;
353+ _value64 = new Byte [ 64 ] ;
354+ Random . Shared . NextBytes ( _value64 ) ;
355+ }
356+
357+ [ GlobalCleanup ]
358+ public void Cleanup ( )
359+ {
360+ try { Directory . Delete ( _storePath , true ) ; } catch { }
361+ }
362+
363+ [ Benchmark ( Description = "海量写入1000万条(64B)" ) ]
364+ public void MassWrite_64B ( )
365+ {
366+ var kvFile = Path . Combine ( _storePath , $ "mass64_{ Guid . NewGuid ( ) : N} .kvd") ;
367+ using var store = new KvStore ( new DbOptions { DefaultKvTtl = TimeSpan . Zero } , kvFile ) ;
368+ for ( var i = 0 ; i < 10_000_000 ; i ++ )
369+ store . Set ( $ "key:{ i } ", _value64 ) ;
370+ }
371+
372+ [ Benchmark ( Description = "海量写入后读取1000万条(64B)" ) ]
373+ public void MassWriteThenRead_64B ( )
374+ {
375+ var kvFile = Path . Combine ( _storePath , $ "massrd64_{ Guid . NewGuid ( ) : N} .kvd") ;
376+ using var store = new KvStore ( new DbOptions { DefaultKvTtl = TimeSpan . Zero } , kvFile ) ;
377+ for ( var i = 0 ; i < 10_000_000 ; i ++ )
378+ store . Set ( $ "key:{ i } ", _value64 ) ;
379+ for ( var i = 0 ; i < 10_000_000 ; i ++ )
380+ store . Get ( $ "key:{ i } ") ;
381+ }
382+
383+ [ Benchmark ( Description = "海量批量写入1000万条(SetAll, 64B)" ) ]
384+ public void MassSetAll_64B ( )
385+ {
386+ var kvFile = Path . Combine ( _storePath , $ "massall64_{ Guid . NewGuid ( ) : N} .kvd") ;
387+ using var store = new KvStore ( new DbOptions { DefaultKvTtl = TimeSpan . Zero } , kvFile ) ;
388+ // 分批写入,每批 1000 条
389+ for ( var batch = 0 ; batch < 10_000 ; batch ++ )
390+ {
391+ var dict = new Dictionary < String , Byte [ ] ? > ( 1000 ) ;
392+ for ( var i = 0 ; i < 1000 ; i ++ )
393+ dict [ $ "key:{ batch * 1000 + i } "] = _value64 ;
394+ store . SetAll ( dict ) ;
395+ }
396+ }
397+
398+ [ Benchmark ( Description = "海量数据搜索(1000万条中搜索)" ) ]
399+ public Int32 MassSearch ( )
400+ {
401+ var kvFile = Path . Combine ( _storePath , $ "masssrc_{ Guid . NewGuid ( ) : N} .kvd") ;
402+ using var store = new KvStore ( new DbOptions { DefaultKvTtl = TimeSpan . Zero } , kvFile ) ;
403+ for ( var i = 0 ; i < 10_000_000 ; i ++ )
404+ store . Set ( $ "key:{ i } ", _value64 ) ;
405+
406+ var count = 0 ;
407+ foreach ( var _ in store . Search ( "key:999*" , 0 , 100 ) )
408+ count ++ ;
409+ return count ;
410+ }
411+ }
0 commit comments