بهبود کارآیی Reflection در دات نت 7
نویسنده: وحید نصیری
تاریخ: ۱۴۰۱/۱۰/۲۵ ۱۸:۳۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
namespace NET7Reflection;
public class Person
{
private int _age;
internal Person(int age) => _age = age;
private int GetAge() => _age;
private void SetAge(int age) => _age = age;
} <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.4" />
</ItemGroup>
</Project> using System.Reflection;
using BenchmarkDotNet.Attributes;
namespace NET7Reflection;
[MemoryDiagnoser(false)]
public class Benchmarks
{
private readonly object?[] _ageParams = { 30 };
private readonly ConstructorInfo _ctor =
typeof(Person).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, new[] { typeof(int) })!;
private readonly MethodInfo _getAgeMethod =
typeof(Person).GetMethod("GetAge", BindingFlags.NonPublic | BindingFlags.Instance)!;
private readonly Person _person = new(10);
private readonly MethodInfo _setAgeMethod =
typeof(Person).GetMethod("SetAge", BindingFlags.NonPublic | BindingFlags.Instance)!;
[Benchmark]
public int GetAge() =>
(int)typeof(Person).GetMethod("GetAge", BindingFlags.NonPublic | BindingFlags.Instance)!
.Invoke(_person, Array.Empty<object?>())!;
[Benchmark]
public int GetAgeCachedMethod() => (int)_getAgeMethod.Invoke(_person, Array.Empty<object?>())!;
[Benchmark]
public void SetAge() =>
typeof(Person).GetMethod("SetAge", BindingFlags.NonPublic | BindingFlags.Instance)!
.Invoke(_person, new object?[] { 30 });
[Benchmark]
public void SetAgeCachedMethod() => _setAgeMethod.Invoke(_person, new object?[] { 30 });
[Benchmark]
public void SetAgeCachedMethodCachedParams() => _setAgeMethod.Invoke(_person, _ageParams);
[Benchmark]
public Person Ctor() =>
(Person)typeof(Person).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, new[] { typeof(int) })!
.Invoke(_person, new object?[] { 30 })!;
[Benchmark]
public Person CtorCachedCtorInfo() => (Person)_ctor.Invoke(_person, new object?[] { 30 })!;
[Benchmark]
public Person CtorCachedCtorInfoCachedParams() => (Person)_ctor.Invoke(_person, _ageParams)!;
} using BenchmarkDotNet.Running; using NET7Reflection; BenchmarkRunner.Run<Benchmarks>();