public void ApplyLoadToTheStorageMirrorTest() { #region ARRANGE PerformanceCounter counterCPU; PerformanceCounter counterRAM; BlockingCollection <float> metricsCPU; BlockingCollection <float> metricsRAM; counterCPU = new PerformanceCounter("Processor", "% Processor Time", "_Total"); counterRAM = new PerformanceCounter("Memory", "Available MBytes"); metricsCPU = new BlockingCollection <float>(100000); metricsRAM = new BlockingCollection <float>(100000); Timer timerCPU; timerCPU = new Timer((state) => { if (metricsCPU.IsAddingCompleted) { float oldest = metricsCPU.FirstOrDefault(); metricsCPU.TryTake(out oldest); } metricsCPU.TryAdd(counterCPU.NextValue()); }, null, 1000, 10); Timer timerRAM; timerRAM = new Timer((state) => { if (metricsRAM.IsAddingCompleted) { float oldest = metricsRAM.FirstOrDefault(); metricsRAM.TryTake(out oldest); } metricsRAM.TryAdd(counterRAM.NextValue()); }, null, 1000, 10); counterCPU.NextValue(); var memoryBefore = counterRAM.NextValue(); Thread.Sleep(1000); // Per MSDN suggestion when using PerformanceCounter mechanism... int totalCandidates = 1000000; int countCallbacks = 0; var random = new Random(); var data = Enumerable.Range(1, totalCandidates).OrderBy(i => random.Next(1, totalCandidates)); CountdownEvent countdown = new CountdownEvent(totalCandidates); TheStorageMirror <TheStorageEngineTSM> mirror; mirror = new TheStorageMirror <TheStorageEngineTSM>(TheCDEngines.MyIStorageService) { IsRAMStore = true, CacheStoreInterval = 1, IsStoreIntervalInSeconds = true, IsCachePersistent = true, UseSafeSave = true, AllowFireUpdates = true, }; #endregion #region ACT Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); try { Parallel.ForEach(data, currentNumber => { mirror.AddAnItem( new TheStorageEngineTSM() { TXTPattern = currentNumber.ToString() }, state => { Interlocked.Increment(ref countCallbacks); countdown.Signal(); }); }); } catch (Exception ex) { Assert.IsTrue(true, ex.Message); } countdown.Wait(); stopwatch.Stop(); timerCPU.Change(Timeout.Infinite, Timeout.Infinite); timerCPU.Dispose(); timerRAM.Change(Timeout.Infinite, Timeout.Infinite); timerRAM.Dispose(); counterCPU?.Dispose(); counterRAM?.Dispose(); countdown?.Dispose(); mirror?.Dispose(); #endregion #region ASSERT float avgCPU = metricsCPU.Average(); float maxCPU = 99f; float avgRAM = metricsRAM.Average(); float maxRAM = memoryBefore + 1000f; Assert.IsTrue( (avgCPU <= maxCPU && avgRAM <= maxRAM && totalCandidates == countCallbacks), buildSummary(totalCandidates, stopwatch.ElapsedMilliseconds, avgCPU, maxCPU, avgRAM, maxRAM)); #endregion }