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