using System.Diagnostics;
namespace ReflectionPerformance
{
public class Program
{
public static void Main()
{
for (var i = 1; i < 10; i++)
{
AddNormally();
}
for (var i = 1; i < 10; i++)
{
AddReflectively();
}
}
private static void AddNormally()
{
var sw = new Stopwatch();
sw.Start();
var o = new ReflectionTarget();
var i = o.Add(1, 2);
sw.Stop();
Console.WriteLine($"Add normally: found {i} in {sw.ElapsedTicks} ticks");
}
private static void AddReflectively()
{
var sw = new Stopwatch();
sw.Start();
var methodInfo = typeof(ReflectionTarget).GetMethod("Add");
var instance = Activator.CreateInstance(typeof(ReflectionTarget));
var result = methodInfo.Invoke(instance, new object[] { 1, 2 });
var i = (int)result;
sw.Stop();
Console.WriteLine($"Add reflectively: found {i} in {sw.ElapsedTicks} ticks");
}
}
public class ReflectionTarget
{
public int Add(int x, int y)
{
return x + y;
}
}
}
Add normally: found 3 in 570 ticks
Add normally: found 3 in 2 ticks
Add normally: found 3 in 1 ticks
Add normally: found 3 in 1 ticks
Add normally: found 3 in 1 ticks
Add normally: found 3 in 0 ticks
Add normally: found 3 in 1 ticks
Add normally: found 3 in 1 ticks
Add normally: found 3 in 1 ticks
Add reflectively: found 3 in 734 ticks
Add reflectively: found 3 in 1933 ticks
Add reflectively: found 3 in 28 ticks
Add reflectively: found 3 in 14 ticks
Add reflectively: found 3 in 10 ticks
Add reflectively: found 3 in 10 ticks
Add reflectively: found 3 in 13 ticks
Add reflectively: found 3 in 10 ticks
Add reflectively: found 3 in 10 ticks
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System.Reflection;
namespace ReflectionPerformance
{
public class Program
{
public static void Main(string[] args)
{
AddNormally();
var summary = BenchmarkRunner.Run(typeof(BenchmarkReflection).Assembly);
}
private static void AddNormally()
{
var o = new ReflectionTarget();
var i = o.Add(1, 2);
}
}
public class BenchmarkReflection
{
private static readonly MethodInfo? MethodCall = typeof(ReflectionTarget).GetMethod("Add");
[Benchmark]
public void AddReflectivelyWithCachedMethodInfo()
{
var instance = Activator.CreateInstance(typeof(ReflectionTarget));
var result = MethodCall.Invoke(instance, new object[] { 1, 2 });
var i = (int)result;
}
[Benchmark]
public void AddReflectively()
{
var methodInfo = typeof(ReflectionTarget).GetMethod("Add");
var instance = Activator.CreateInstance(typeof(ReflectionTarget));
var result = methodInfo.Invoke(instance, new object[] { 1, 2 });
var i = (int)result;
}
}
public class ReflectionTarget
{
public int Add(int x, int y)
{
return x + y;
}
}
}
BenchmarkDotNet v0.13.12, Windows 10 (10.0.19045.3803/22H2/2022Update)
Intel Core i9-9900K CPU 3.60GHz (Coffee Lake), 1 CPU, 16 logical and 8 physical cores
.NET SDK 8.0.100
[Host] : .NET 8.0.0 (8.0.23.53103), X64 RyuJIT AVX2 [AttachedDebugger]
DefaultJob : .NET 8.0.0 (8.0.23.53103), X64 RyuJIT AVX2
| Method | Mean | Error | StdDev |
|------------------------------------ |---------:|---------:|---------:|
| AddReflectivelyWithCachedMethodInfo | 39.15 ns | 0.757 ns | 0.743 ns |
| AddReflectively | 60.63 ns | 0.703 ns | 0.623 ns |