typeof(T) vs. TypeOf⟨T⟩
using System;
using System.Diagnostics;
using System.Linq;
using Ace.Base.Benchmarking.Benchmarks;
using BenchmarkDotNet.Running;
namespace Ace.Base.Benchmarking
{
static class Program
{
private const long WarmRunsCount = 1000;
private const long HotRunsCount = 10000000; // 10 000 000
static void Main()
{
//BenchmarkRunner.Run();
//BenchmarkRunner.Run();
TypeofVsTypeOf();
RawTypeVsRipeType();
Console.ReadKey();
}
static void RawTypeVsRipeType()
{
Console.WriteLine();
Console.WriteLine($"Count of warm iterations: {WarmRunsCount}");
Console.WriteLine($"Count of hot iterations: {HotRunsCount}");
Console.WriteLine();
var o = new object();
var rawType = o.GetType();
var ripeType = o.GetRipeType();
RunBenchmarks(
(() => rawType.Name, "() => rawType.Name"),
(() => ripeType.Name, "() => ripeType.Name"),
(() => o.GetType().Name, "() => o.GetType().Name"),
(() => o.GetRipeType().Name, "() => o.GetRipeType().Name")
);
Console.WriteLine();
RunBenchmarks(
(() => rawType.Assembly, "() => rawType.Assembly"),
(() => ripeType.Assembly, "() => ripeType.Assembly"),
(() => o.GetType().Assembly, "() => o.GetType().Assembly"),
(() => o.GetRipeType().Assembly, "() => o.GetRipeType().Assembly")
);
Console.WriteLine();
RunBenchmarks(
(() => rawType.IsValueType, "() => rawType.IsValueType"),
(() => ripeType.IsValueType, "() => ripeType.IsValueType"),
(() => o.GetType().IsValueType, "() => o.GetType().IsValueType"),
(() => o.GetRipeType().IsValueType, "() => o.GetRipeType().IsValueType")
);
}
static void TypeofVsTypeOf()
{
Console.WriteLine($"Count of warm iterations: {WarmRunsCount}");
Console.WriteLine($"Count of hot iterations: {HotRunsCount}");
Console.WriteLine();
RunBenchmarks(
(() => typeof(int), "() => typeof(int)"),
(() => TypeOf.Raw, "() => TypeOf.Raw"),
(() => typeof(string), "() => typeof(string)"),
(() => TypeOf.Raw, "() => TypeOf.Raw")
);
Console.WriteLine();
RunBenchmarks(
(() => typeof(int).Name, "() => typeof(int).Name"),
(() => TypeOf.Name, "() => TypeOf.Name"),
(() => typeof(string).Name, "() => typeof(string).Name"),
(() => TypeOf.Name, "() => TypeOf.Name")
);
Console.WriteLine();
RunBenchmarks(
(() => typeof(int).Assembly, "() => typeof(int).Assembly"),
(() => TypeOf.Assembly, "() => TypeOf.Assembly"),
(() => typeof(string).Assembly, "() => typeof(string).Assembly"),
(() => TypeOf.Assembly, "() => TypeOf.Assembly")
);
Console.WriteLine();
RunBenchmarks(
(() => typeof(int).IsValueType, "() => typeof(int).IsValueType"),
(() => TypeOf.IsValueType, "() => TypeOf.IsValueType"),
(() => typeof(string).IsValueType, "() => typeof(string).IsValueType"),
(() => TypeOf.IsValueType, "() => TypeOf.IsValueType")
);
}
static void RunBenchmarks(params (Func Func, string StringRepresentation)[] funcAndViewTuples) =>
funcAndViewTuples
.Select(t => (
BenchmarkResults: t.Func.InvokeBenchmark(HotRunsCount, WarmRunsCount),
StringRepresentation: t.StringRepresentation))
.ToList().ForEach(t =>
Console.WriteLine(
$"{t.StringRepresentation}\t{t.BenchmarkResults.Result}\t{t.BenchmarkResults.ElapsedMilliseconds} (ms)"));
static (Func Func, long ElapsedMilliseconds, T Result) InvokeBenchmark(this Func func,
long hotRunsCount, long warmRunsCount)
{
var stopwatch = new Stopwatch();
var result = default(T);
for (var i = 0L; i < warmRunsCount; i++)
result = func();
stopwatch.Start();
for (var i = 0L; i < hotRunsCount; i++)
result = func();
stopwatch.Stop();
return (func, stopwatch.ElapsedMilliseconds, result);
}
}
}