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 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>net7.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="BenchmarkDotNet" Version="0.13.5" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\BenchMarkDotnetStudy.Core\BenchMarkDotnetStudy.Core.csproj" /> + </ItemGroup> + +</Project> 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 +{ + /// <summary> + /// Counter 基准测试 + /// </summary> + public class CounterTest + { + [Benchmark] + public void Thread1_Test() + { + Counter counter = new Counter(); + counter.Increment(); + } + + [Benchmark] + public void Thread2_Test() + { + Counter counter = new Counter(); + + List<Thread> threads = new List<Thread>() + { + 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<Thread> threads = new List<Thread>() + { + 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<Thread> threads = new List<Thread>() + { + 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<Thread> threads = new List<Thread>() + { + 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<Thread> threads = new List<Thread>() + { + 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<Thread> threads = new List<Thread>() + { + 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<Thread> threads = new List<Thread>() + { + 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<Thread> threads = new List<Thread>() + { + 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<Thread> threads = new List<Thread>() + { + 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<Thread> threads = new List<Thread>() + { + 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<CounterTest3>(); + + 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 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFramework>net7.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\BenchMarkDotnetStudy.Core\BenchMarkDotnetStudy.Core.csproj" /> + </ItemGroup> + + <ItemGroup> + <Folder Include="Properties\" /> + </ItemGroup> + +</Project> 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 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>netstandard2.1</TargetFramework> + <Nullable>enable</Nullable> + </PropertyGroup> + +</Project> 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 +{ + /// <summary> + /// 计数器 + /// </summary> + public class Counter + { + /// <summary> + /// 总次数 + /// </summary> + public static int TotalCounter = 0; + + /// <summary> + /// 每方法执行次数 + /// </summary> + public static readonly int LoopNumber = 1000; + + /// <summary> + /// 累加方法 + /// </summary> + public int Increment() + { + for (int i = 1; i <= LoopNumber; i++) + { + ++TotalCounter; + } + + return TotalCounter; + } + + /// <summary> + /// 累加方法 + /// </summary> + 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