using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using BenchmarkDotNet; using BenchmarkDotNet.Attributes; using BenchMarkDotnetStudy.Core; namespace BenchMarkDotnetStudy.BenchmarkStudy { /// /// Counter 基准测试 /// public class CounterTest { [Benchmark] public void Thread1_Test() { Counter counter = new Counter(); counter.Increment(); } [Benchmark] public void Thread2_Test() { Counter counter = new Counter(); List threads = new List() { new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), }; threads.ForEach(t => t.Start()); threads.ForEach(t => t.Join()); } [Benchmark] public void Thread4_Test() { Counter counter = new Counter(); List threads = new List() { new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), }; threads.ForEach(t => t.Start()); threads.ForEach(t => t.Join()); } [Benchmark] public void Thread8_Test() { Counter counter = new Counter(); List threads = new List() { new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), }; threads.ForEach(t => t.Start()); threads.ForEach(t => t.Join()); } [Benchmark] public void Thread16_Test() { Counter counter = new Counter(); List threads = new List() { new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), }; threads.ForEach(t => t.Start()); threads.ForEach(t => t.Join()); } [Benchmark] public void Thread32_Test() { Counter counter = new Counter(); List threads = new List() { new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), new Thread(() => counter.Increment() ), }; threads.ForEach(t => t.Start()); threads.ForEach(t => t.Join()); } [Benchmark] public void Thread1_Test2() { Counter counter = new Counter(); counter.IncrementWithInterlocked(); } [Benchmark] public void Thread2_Test2() { Counter counter = new Counter(); List threads = new List() { new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), }; threads.ForEach(t => t.Start()); threads.ForEach(t => t.Join()); } [Benchmark] public void Thread4_Test2() { Counter counter = new Counter(); List threads = new List() { new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), }; threads.ForEach(t => t.Start()); threads.ForEach(t => t.Join()); } [Benchmark] public void Thread8_Test2() { Counter counter = new Counter(); List threads = new List() { new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), }; threads.ForEach(t => t.Start()); threads.ForEach(t => t.Join()); } [Benchmark] public void Thread16_Test2() { Counter counter = new Counter(); List threads = new List() { new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), }; threads.ForEach(t => t.Start()); threads.ForEach(t => t.Join()); } [Benchmark] public void Thread32_Test2() { Counter counter = new Counter(); List threads = new List() { new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), new Thread(() => counter.IncrementWithInterlocked() ), }; threads.ForEach(t => t.Start()); threads.ForEach(t => t.Join()); } } }