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