You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

302 lines
11 KiB
C#

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());
}
}
}