2
0

MemCacheTest2.dpr 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. program MemCacheTest2;
  2. {$APPTYPE CONSOLE}
  3. {$R *.res}
  4. uses
  5. System.SysUtils,
  6. Quick.Commons,
  7. Quick.Console,
  8. Quick.Threads,
  9. Quick.Chrono,
  10. Quick.Format,
  11. Quick.MemoryCache;
  12. type
  13. TMyObject = class
  14. private
  15. fTestStr : string;
  16. fTestInt : Integer;
  17. public
  18. property TestStr : string read fTestStr write fTestStr;
  19. property TestInt : Integer read fTestInt write fTestInt;
  20. end;
  21. var
  22. cache : TMemoryCache<string>;
  23. valuestr : string;
  24. valueint : Integer;
  25. valuefloat : Extended;
  26. valuebool : Boolean;
  27. valueobj : TMyObject;
  28. backgroundtasks : TBackgroundTasks;
  29. i : Integer;
  30. n : Integer;
  31. chrono : TChronometer;
  32. dummystr : string;
  33. arr : TArray<string>;
  34. begin
  35. ReportMemoryLeaksOnShutdown := True;
  36. backgroundtasks := TBackgroundTasks.Create(20,100);
  37. cache := TMemoryCache<string>.Create(10);
  38. //cache := TMemoryCache.Create(10,nil,TCacheCompressorLZO.Create);
  39. cache.Compression := True;
  40. cache.OnEndPurgerJob := procedure(aRemovedEntries : Integer)
  41. begin
  42. cout(Format('Purger job finished (Removed: %s /CachedObjects: %s / CacheSize: %s)',[NumberToStr(aRemovedEntries),NumberToStr(cache.CachedObjects),FormatBytes(cache.CacheSize)]),ccMagenta);
  43. end;
  44. cache.OnPurgeJobError := procedure(const aErrorMsg : string)
  45. begin
  46. coutFmt('Error flushing cache expireds (%s)',[aErrorMsg],etError);
  47. end;
  48. chrono := TChronometer.Create(False);
  49. //concurrent read/writes
  50. dummystr := '';
  51. cout('Preparing data..',ccWhite);
  52. //for i := 0 to 1024 do dummystr := dummystr + Chr(Random(255));
  53. cache.SetValue('obj1',dummystr,30000);
  54. dummystr := RandomString(1024);
  55. n := 0;
  56. for i := 1 to 100000 do
  57. begin
  58. Inc(n);
  59. if n < 9 then
  60. begin
  61. backgroundtasks.AddTask(procedure(task : ITask)
  62. var
  63. a : string;
  64. begin
  65. if not cache.TryGetValue('obj1',a) then
  66. begin
  67. coutFmt('Value %d not in cache or expired',[1],etWarning);
  68. cache.SetValue('obj1',dummystr,1000);
  69. end;
  70. //coutFmt('Get Id(1) from cache = %s',[a],etSuccess);
  71. end
  72. ).Run;
  73. end
  74. else
  75. begin
  76. n := 0;
  77. backgroundtasks.AddTask(procedure(task : ITask)
  78. var
  79. a : string;
  80. begin
  81. a := Random(1000000).ToString;
  82. cache.SetValue(a,dummystr,Random(5000));
  83. //coutFmt('Set Id(1) to cache = %s',[a],etSuccess);
  84. end
  85. ).Run;
  86. end;
  87. end;
  88. backgroundtasks.AddTask(procedure(task : ITask)
  89. begin
  90. chrono.Stop;
  91. coutFmt('Performance: %s Combined cache IO Read/Writes in %s',[NumberToStr(i),chrono.ElapsedTime],etWarning);
  92. coutFmt('Cached Objects: %s / Cache Size: %s',[NumberToStr(cache.CachedObjects),FormatBytes(cache.CacheSize)],etInfo);
  93. cout('Wait to see how cache is expiring every 10 seconds or press <ENTER> to Exit',ccYellow);
  94. //cache.Flush;
  95. end
  96. ).Run;
  97. cout('Stress caching test launched...',ccWhite);
  98. backgroundtasks.Start;
  99. chrono.Start;
  100. ConsoleWaitForEnterKey;
  101. coutFmt('Cached Objects: %s / Cache Size: %s',[NumberToStr(cache.CachedObjects),FormatBytes(cache.CacheSize)],etInfo);
  102. cache.Free;
  103. chrono.Free;
  104. backgroundtasks.Free;
  105. end.