diff --git a/BenchMarkDotnetStudy.BenchmarkStudy/BenchMarkDotnetStudy.BenchmarkStudy.csproj b/BenchMarkDotnetStudy.BenchmarkStudy/BenchMarkDotnetStudy.BenchmarkStudy.csproj new file mode 100644 index 0000000..6115072 --- /dev/null +++ b/BenchMarkDotnetStudy.BenchmarkStudy/BenchMarkDotnetStudy.BenchmarkStudy.csproj @@ -0,0 +1,18 @@ + + + + Exe + net7.0 + enable + enable + + + + + + + + + + + diff --git a/BenchMarkDotnetStudy.BenchmarkStudy/CounterTest.cs b/BenchMarkDotnetStudy.BenchmarkStudy/CounterTest.cs new file mode 100644 index 0000000..8795fa9 --- /dev/null +++ b/BenchMarkDotnetStudy.BenchmarkStudy/CounterTest.cs @@ -0,0 +1,301 @@ +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()); + } + } +} diff --git a/BenchMarkDotnetStudy.BenchmarkStudy/CounterTest2.cs b/BenchMarkDotnetStudy.BenchmarkStudy/CounterTest2.cs new file mode 100644 index 0000000..ff37711 Binary files /dev/null and b/BenchMarkDotnetStudy.BenchmarkStudy/CounterTest2.cs differ diff --git a/BenchMarkDotnetStudy.BenchmarkStudy/CounterTest3.cs b/BenchMarkDotnetStudy.BenchmarkStudy/CounterTest3.cs new file mode 100644 index 0000000..c9c8fb9 Binary files /dev/null and b/BenchMarkDotnetStudy.BenchmarkStudy/CounterTest3.cs differ diff --git a/BenchMarkDotnetStudy.BenchmarkStudy/Program.cs b/BenchMarkDotnetStudy.BenchmarkStudy/Program.cs new file mode 100644 index 0000000..5c63bf6 --- /dev/null +++ b/BenchMarkDotnetStudy.BenchmarkStudy/Program.cs @@ -0,0 +1,18 @@ +using BenchmarkDotNet.Running; + +namespace BenchMarkDotnetStudy.BenchmarkStudy +{ + internal class Program + { + static void Main(string[] args) + { + Console.WriteLine("Benchmark 测试!"); + + var summary = BenchmarkRunner.Run(); + + Console.WriteLine("Benchmark 测试结束:"); + + Console.WriteLine($"总耗时:{summary.AllRuntimes}"); + } + } +} \ No newline at end of file diff --git a/BenchMarkDotnetStudy.CApp/BenchMarkDotnetStudy.CApp.csproj b/BenchMarkDotnetStudy.CApp/BenchMarkDotnetStudy.CApp.csproj new file mode 100644 index 0000000..0dc0fc7 --- /dev/null +++ b/BenchMarkDotnetStudy.CApp/BenchMarkDotnetStudy.CApp.csproj @@ -0,0 +1,18 @@ + + + + Exe + net7.0 + enable + enable + + + + + + + + + + + diff --git a/BenchMarkDotnetStudy.CApp/Program.cs b/BenchMarkDotnetStudy.CApp/Program.cs new file mode 100644 index 0000000..93ef4c4 --- /dev/null +++ b/BenchMarkDotnetStudy.CApp/Program.cs @@ -0,0 +1,10 @@ +namespace BenchMarkDotnetStudy.CApp +{ + internal class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello, World!"); + } + } +} \ No newline at end of file diff --git a/BenchMarkDotnetStudy.Core/BenchMarkDotnetStudy.Core.csproj b/BenchMarkDotnetStudy.Core/BenchMarkDotnetStudy.Core.csproj new file mode 100644 index 0000000..8ef8970 --- /dev/null +++ b/BenchMarkDotnetStudy.Core/BenchMarkDotnetStudy.Core.csproj @@ -0,0 +1,8 @@ + + + + netstandard2.1 + enable + + + diff --git a/BenchMarkDotnetStudy.Core/Counter.cs b/BenchMarkDotnetStudy.Core/Counter.cs new file mode 100644 index 0000000..40d4d90 --- /dev/null +++ b/BenchMarkDotnetStudy.Core/Counter.cs @@ -0,0 +1,47 @@ +using System; +using System.Threading; + +namespace BenchMarkDotnetStudy.Core +{ + /// + /// 计数器 + /// + public class Counter + { + /// + /// 总次数 + /// + public static int TotalCounter = 0; + + /// + /// 每方法执行次数 + /// + public static readonly int LoopNumber = 1000; + + /// + /// 累加方法 + /// + public int Increment() + { + for (int i = 1; i <= LoopNumber; i++) + { + ++TotalCounter; + } + + return TotalCounter; + } + + /// + /// 累加方法 + /// + public int IncrementWithInterlocked() + { + for (int i = 1; i <= LoopNumber; i++) + { + Interlocked.Increment(ref TotalCounter); + } + + return TotalCounter; + } + } +} diff --git a/BenchMarkDotnetStudy.sln b/BenchMarkDotnetStudy.sln new file mode 100644 index 0000000..2c9bb37 --- /dev/null +++ b/BenchMarkDotnetStudy.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.33516.290 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BenchMarkDotnetStudy.Core", "BenchMarkDotnetStudy.Core\BenchMarkDotnetStudy.Core.csproj", "{8C37BE95-8908-4038-BF56-F0F1A5F4C52C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BenchMarkDotnetStudy.CApp", "BenchMarkDotnetStudy.CApp\BenchMarkDotnetStudy.CApp.csproj", "{D5D6E7DF-82AF-4F78-BB60-A0BE378B97E4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BenchMarkDotnetStudy.BenchmarkStudy", "BenchMarkDotnetStudy.BenchmarkStudy\BenchMarkDotnetStudy.BenchmarkStudy.csproj", "{AFA892FB-C52A-443D-B0F0-3E458DDCDC7F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8C37BE95-8908-4038-BF56-F0F1A5F4C52C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8C37BE95-8908-4038-BF56-F0F1A5F4C52C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C37BE95-8908-4038-BF56-F0F1A5F4C52C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8C37BE95-8908-4038-BF56-F0F1A5F4C52C}.Release|Any CPU.Build.0 = Release|Any CPU + {D5D6E7DF-82AF-4F78-BB60-A0BE378B97E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5D6E7DF-82AF-4F78-BB60-A0BE378B97E4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5D6E7DF-82AF-4F78-BB60-A0BE378B97E4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5D6E7DF-82AF-4F78-BB60-A0BE378B97E4}.Release|Any CPU.Build.0 = Release|Any CPU + {AFA892FB-C52A-443D-B0F0-3E458DDCDC7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AFA892FB-C52A-443D-B0F0-3E458DDCDC7F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AFA892FB-C52A-443D-B0F0-3E458DDCDC7F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AFA892FB-C52A-443D-B0F0-3E458DDCDC7F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0AF1E897-2AFD-4DEC-8D48-D24CDF486479} + EndGlobalSection +EndGlobal