2
0

MemCacheTest.dpr 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. program MemCacheTest;
  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<TMyObject>;
  23. valueobj : TMyObject;
  24. backgroundtasks : TBackgroundTasks;
  25. i : Integer;
  26. n : Integer;
  27. chrono : TChronometer;
  28. dummystr : string;
  29. begin
  30. ReportMemoryLeaksOnShutdown := True;
  31. backgroundtasks := TBackgroundTasks.Create(20,100);
  32. cache := TMemoryCache<TMyObject>.Create(10);
  33. //cache := TMemoryCache.Create(10,nil,TCacheCompressorLZO.Create);
  34. cache.Compression := True;
  35. cache.OnEndPurgerJob := procedure(aRemovedEntries : Integer)
  36. begin
  37. cout(Format('Purger job finished (Removed: %s /CachedObjects: %s / CacheSize: %s)',[NumberToStr(aRemovedEntries),NumberToStr(cache.CachedObjects),FormatBytes(cache.CacheSize)]),ccMagenta);
  38. end;
  39. cache.OnPurgeJobError := procedure(const aErrorMsg : string)
  40. begin
  41. coutFmt('Error flushing cache expireds (%s)',[aErrorMsg],etError);
  42. end;
  43. //set object to cache
  44. valueobj := TMyObject.Create;
  45. try
  46. valueobj.TestStr := 'TestOk';
  47. valueobj.TestInt := 7;
  48. cache.SetValue('obj1',valueobj);
  49. finally
  50. valueobj.Free;
  51. end;
  52. //get object from cache
  53. //valueobj := TMyObject.Create;
  54. try
  55. //cache.TryGetValue('Obj1',valueobj,TMyObject);
  56. cache.TryGetValue('obj1',valueobj);
  57. coutFmt('Got Id(obj1) from cache: (TestStr = %s / TestIn = %d)',[valueobj.TestStr,valueobj.TestInt],etSuccess);
  58. finally
  59. valueobj.Free;
  60. end;
  61. chrono := TChronometer.Create(False);
  62. //concurrent read/writes
  63. dummystr := '';
  64. cout('Preparing data..',ccWhite);
  65. //for i := 0 to 1024 do dummystr := dummystr + Chr(Random(255));
  66. dummystr := RandomString(1024);
  67. n := 0;
  68. for i := 1 to 100000 do
  69. begin
  70. Inc(n);
  71. if n < 9 then
  72. begin
  73. backgroundtasks.AddTask(procedure(task : ITask)
  74. var obj : TMyObject;
  75. begin
  76. if not cache.TryGetValue('obj1',obj) then
  77. begin
  78. coutFmt('Value %d not in cache or expired',[1],etWarning);
  79. obj := TMyObject.Create;
  80. try
  81. obj.TestStr := 'TestOk';
  82. obj.TestInt := 7;
  83. cache.SetValue('obj1',obj,1000);
  84. finally
  85. obj.Free;
  86. end;
  87. end;
  88. //coutFmt('Get Id(1) from cache = %s',[obj.TestStr],etSuccess);
  89. end
  90. ).OnException(procedure(task : ITask; aException : Exception)
  91. begin
  92. cout(aException.Message,etError);
  93. end
  94. ).Run;
  95. end
  96. else
  97. begin
  98. n := 0;
  99. backgroundtasks.AddTask(procedure(task : ITask)
  100. var
  101. obj : TMyObject;
  102. begin
  103. obj := TMyObject.Create;
  104. try
  105. obj.TestStr := 'TestOk';
  106. obj.TestInt := 7;
  107. cache.SetValue(Random(1000000).ToString,obj,Random(5000));
  108. finally
  109. obj.Free;
  110. end;
  111. //coutFmt('Set Id(1) to cache = %s',[obj.TestStr],etSuccess);
  112. end
  113. ).OnException(procedure(task : ITask; aException : Exception)
  114. begin
  115. cout(aException.Message,etError);
  116. end
  117. ).Run;
  118. end;
  119. end;
  120. backgroundtasks.AddTask(procedure(task : ITask)
  121. begin
  122. chrono.Stop;
  123. coutFmt('Performance: %s Combined cache IO Read/Writes in %s',[NumberToStr(i),chrono.ElapsedTime],etWarning);
  124. coutFmt('Cached Objects: %s / Cache Size: %s',[NumberToStr(cache.CachedObjects),FormatBytes(cache.CacheSize)],etInfo);
  125. cout('Wait to see how cache is expiring every 10 seconds or press <ENTER> to Exit',ccYellow);
  126. //cache.Flush;
  127. end
  128. ).Run;
  129. cout('Stress caching test launched...',ccWhite);
  130. backgroundtasks.Start;
  131. chrono.Start;
  132. ConsoleWaitForEnterKey;
  133. coutFmt('Cached Objects: %s / Cache Size: %s',[NumberToStr(cache.CachedObjects),FormatBytes(cache.CacheSize)],etInfo);
  134. cache.Free;
  135. chrono.Free;
  136. backgroundtasks.Free;
  137. end.