public void QueuePerformanceTest() { var stats = new List<TestStat>(); for (var testIndex = 0; testIndex < 100; testIndex++) { var queue = new ConcurrentQueue<QItem>(); var dt = new DisposerTest( new PessimisticDisposer(), (threadIndex) => { var q = new QItem(threadIndex); queue.Enqueue(q); }, () => { var q = new QItem(-1); queue.Enqueue(q); } ); var threadCount = Environment.ProcessorCount + 2; var timeout = 50; Debug.WriteLine("Test {0} (threads = {1}, timeout = {2}) ", testIndex, threadCount, timeout); dt.DoTest( threadCount, timeout ); //преобразуем в лист var resultList = new List<QItem>(); QItem current; while (queue.TryDequeue(out current)) { resultList.Add(current); } //анализируем лист //проверяем что диспоуз 1 if (resultList.Count(j => j.ThreadId == -1) != 1) { throw new InvalidOperationException("диспоузов несколько"); } //проверяем что диспоуз последний if (resultList.Last().ThreadId != -1) { throw new InvalidOperationException("диспоуз не последний"); } //собираем и сохраняем статистику var th = new long[threadCount]; foreach (var i in resultList) { if (i.ThreadId >= 0) { th[i.ThreadId]++; } } var stat = new TestStat( th, resultList.Count - 1 // - 1 это вычесть евент диспоуза ); stats.Add(stat); GC.Collect(3); GC.WaitForPendingFinalizers(); GC.Collect(3); } Debug.WriteLine(string.Empty); Debug.WriteLine("Success"); Debug.WriteLine("Total = {0}", stats.Sum(j => j.TotalCount)); }
public void QueueCorrectnessTest() { var random = new Random( int.Parse(Guid.NewGuid().ToString().Replace("-", "").Substring(0, 7), NumberStyles.HexNumber) ); for (var testIndex = 0; testIndex < 150; testIndex++) { var queue = new ConcurrentQueue<QItem>(); var dt = new DisposerTest( new PessimisticDisposer(), (threadIndex) => { var q = new QItem(threadIndex); queue.Enqueue(q); }, () => { var q = new QItem(-1); queue.Enqueue(q); } ); var threadCount = 2 + random.Next(Environment.ProcessorCount*2); var timeout = 5 + random.Next(20); Debug.WriteLine("Test {0} (threads = {1}, timeout = {2}) ", testIndex, threadCount, timeout); dt.DoTest( threadCount, timeout ); //преобразуем в лист var resultList = new List<QItem>(); QItem current; while (queue.TryDequeue(out current)) { resultList.Add(current); } //анализируем лист //проверяем что диспоуз 1 if (resultList.Count(j => j.ThreadId == -1) != 1) { throw new InvalidOperationException("диспоузов несколько"); } //проверяем что диспоуз последний if (resultList.Last().ThreadId != -1) { throw new InvalidOperationException("диспоуз не последний"); } GC.Collect(3); GC.WaitForPendingFinalizers(); GC.Collect(3); } Debug.WriteLine(string.Empty); Debug.WriteLine("Success"); }
public void QueuePerformanceTest() { var stats = new List<TestStat>(); for (var testIndex = 0; testIndex < 100; testIndex++) { var queue = new ConcurrentQueue<QItem>(); var dt = new DisposerTest( new ThreadUnsafeDisposer(), (threadIndex) => { var q = new QItem(threadIndex); queue.Enqueue(q); }, () => { var q = new QItem(-1); queue.Enqueue(q); } ); var threadCount = Environment.ProcessorCount + 2; var timeout = 50; Debug.WriteLine("Test {0} (threads = {1}, timeout = {2}) ", testIndex, threadCount, timeout); dt.DoTest( threadCount, timeout ); //преобразуем в лист var resultList = new List<QItem>(); QItem current; while (queue.TryDequeue(out current)) { resultList.Add(current); } //не анализируем лист, так как это фейковый диспозер //собираем и сохраняем статистику var th = new long[threadCount]; foreach (var i in resultList) { if (i.ThreadId >= 0) { th[i.ThreadId]++; } } var stat = new TestStat( th, resultList.Count - 1 // - 1 это вычесть евент диспоуза ); stats.Add(stat); GC.Collect(3); GC.WaitForPendingFinalizers(); GC.Collect(3); } Debug.WriteLine(string.Empty); Debug.WriteLine("Success"); Debug.WriteLine("Total = {0}", stats.Sum(j => j.TotalCount)); }