222 lines
5.6 KiB
C#
222 lines
5.6 KiB
C#
using BenchmarkDotNet.Attributes;
|
||
using BenchmarkDotNet.Columns;
|
||
using BenchmarkDotNet.Configs;
|
||
using BenchmarkDotNet.Loggers;
|
||
using BenchmarkDotNet.Running;
|
||
using BenchmarkDotNet.Validators;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
|
||
[MemoryDiagnoser]
|
||
[RankColumn]
|
||
public class Benchmark_1
|
||
{
|
||
[Benchmark]
|
||
public void StructTest()
|
||
{
|
||
StructPoint structPoint = new StructPoint()
|
||
{
|
||
X = 1,
|
||
Y = 2
|
||
};
|
||
var result = structPoint.X = structPoint.Y;
|
||
}
|
||
|
||
[Benchmark]
|
||
public void ClassTest()
|
||
{
|
||
ClassPoint classPoint = new ClassPoint()
|
||
{
|
||
X = 1,
|
||
Y = 2
|
||
};
|
||
var result = classPoint.X = classPoint.Y;
|
||
}
|
||
}
|
||
|
||
[MemoryDiagnoser]
|
||
[RankColumn]
|
||
public class Benchmark_2
|
||
{
|
||
[Benchmark]
|
||
public void StructArrayTest()
|
||
{
|
||
var structPoints = new StructPoint[100];
|
||
// частично находится в куче
|
||
// в массиве через каждый интервал который отвечает
|
||
// размеру минимального элемента находятся реальные данные структуры
|
||
// разница в быстродействии в том, что мы выделяем память в управляемой куче лишь единожды для массива структур
|
||
for (int i = 0; i < structPoints.Length; i++)
|
||
{
|
||
structPoints[i] = new StructPoint();
|
||
}
|
||
}
|
||
|
||
[Benchmark]
|
||
public void ClassArrayTest()
|
||
{
|
||
// в начале в куче создается сам массив
|
||
// но для каждого объекта класса есть ссылка которую мы помещаем в массив и по каждой ссылке нужно запросить данные из кучи
|
||
ClassPoint[] classPoints = new ClassPoint[100];
|
||
// в массиве находятся не реальные данные а ссылки на данные
|
||
for (int i = 0; i < classPoints.Length; i++)
|
||
{
|
||
classPoints[i] = new ClassPoint();
|
||
}
|
||
}
|
||
}
|
||
|
||
[MemoryDiagnoser]
|
||
[RankColumn]
|
||
public class Benchmark_3
|
||
{
|
||
struct MyStruct
|
||
{
|
||
public decimal MyProperty1 { get; set; }
|
||
public decimal MyProperty2 { get; set; }
|
||
public decimal MyProperty3 { get; set; }
|
||
public decimal MyProperty4 { get; set; }
|
||
public decimal MyProperty5 { get; set; }
|
||
public decimal MyProperty6 { get; set; }
|
||
public decimal MyProperty7 { get; set; }
|
||
public decimal MyProperty8 { get; set; }
|
||
public decimal MyProperty9 { get; set; }
|
||
public decimal MyProperty10 { get; set; }
|
||
}
|
||
|
||
class MyClass
|
||
{
|
||
public decimal MyProperty1 { get; set; }
|
||
public decimal MyProperty2 { get; set; }
|
||
public decimal MyProperty3 { get; set; }
|
||
public decimal MyProperty4 { get; set; }
|
||
public decimal MyProperty5 { get; set; }
|
||
public decimal MyProperty6 { get; set; }
|
||
public decimal MyProperty7 { get; set; }
|
||
public decimal MyProperty8 { get; set; }
|
||
public decimal MyProperty9 { get; set; }
|
||
public decimal MyProperty10 { get; set; }
|
||
}
|
||
|
||
private MyStruct _myStruct = new MyStruct();
|
||
private MyClass _myClass = new MyClass();
|
||
|
||
private void Foo(MyClass myClass)
|
||
{
|
||
var t = myClass.MyProperty1 + myClass.MyProperty2;
|
||
}
|
||
|
||
private void Bar(MyStruct myStruct)
|
||
{
|
||
var t = myStruct.MyProperty1 + myStruct.MyProperty2;
|
||
}
|
||
|
||
private void BarIn(in MyStruct myStruct)
|
||
{
|
||
var t = myStruct.MyProperty1 + myStruct.MyProperty2;
|
||
}
|
||
|
||
[Benchmark]
|
||
public void StructTest()
|
||
{
|
||
Bar(_myStruct);
|
||
}
|
||
|
||
[Benchmark]
|
||
public void StructTestIn()
|
||
{
|
||
BarIn(_myStruct);
|
||
}
|
||
|
||
[Benchmark]
|
||
public void ClassTest()
|
||
{
|
||
Foo(_myClass);
|
||
}
|
||
}
|
||
|
||
[MemoryDiagnoser]
|
||
[RankColumn]
|
||
public class Benchmark_4
|
||
{
|
||
[Benchmark]
|
||
public void NoBoxing()
|
||
{
|
||
int res = 0;
|
||
double a = 1;
|
||
res += (int)a;
|
||
}
|
||
|
||
[Benchmark]
|
||
public void Boxing()
|
||
{
|
||
int res = 0;
|
||
object a = 1;
|
||
res += (int)a;
|
||
}
|
||
}
|
||
|
||
[MemoryDiagnoser]
|
||
[RankColumn]
|
||
public class Benchmark_5
|
||
{
|
||
[Benchmark]
|
||
public void Swaps() // 4ns
|
||
{
|
||
object a = 5;
|
||
object b = 1;
|
||
SwapTestClass.Swap(ref a, ref b);
|
||
}
|
||
|
||
[Benchmark]
|
||
public void GenericSwaps() // 0ns
|
||
{
|
||
double p1 = 5;
|
||
double p2 = 1;
|
||
SwapTestClass.GenericSwap(ref p1, ref p2);
|
||
}
|
||
}
|
||
|
||
[MemoryDiagnoser]
|
||
[RankColumn]
|
||
public class Benchmark_6
|
||
{
|
||
[Benchmark]
|
||
public void ArrayListBench()
|
||
{
|
||
var arrayList = new ArrayList();
|
||
for (int el = 0; el < 1000; el++)
|
||
{
|
||
arrayList.Add(el);
|
||
}
|
||
}
|
||
|
||
[Benchmark]
|
||
public void ListBench()
|
||
{
|
||
var _list = new List<int>();
|
||
for (int el = 0; el < 1000; el++)
|
||
{
|
||
_list.Add(el);
|
||
}
|
||
}
|
||
}
|
||
|
||
class Program
|
||
{
|
||
static void Main(string[] args)
|
||
{
|
||
//BenchmarkRunner.Run<MyParserBenchmark>();
|
||
//BenchmarkRunner.Run<Benchmark_1>();
|
||
//BenchmarkRunner.Run<Benchmark_2>();
|
||
//BenchmarkRunner.Run<Benchmark_3>();
|
||
//BenchmarkRunner.Run<Benchmark_4>();
|
||
var config = new ManualConfig()
|
||
.WithOptions(ConfigOptions.DisableOptimizationsValidator)
|
||
.AddValidator(JitOptimizationsValidator.DontFailOnError)
|
||
.AddLogger(ConsoleLogger.Default)
|
||
.AddColumnProvider(DefaultColumnProviders.Instance);
|
||
|
||
BenchmarkRunner.Run<Benchmark_5>(config);
|
||
}
|
||
} |