Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Add additional benchmarks for reflection's FieldInfo get\set #3863

Merged
merged 2 commits into from
Feb 9, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 94 additions & 1 deletion src/benchmarks/micro/runtime/System.Reflection/Invoke.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,13 @@ public class Invoke
private static PropertyInfo s_property_class;
private static FieldInfo s_field_int;
private static FieldInfo s_field_class;

private static FieldInfo s_field_struct;
private static FieldInfo s_staticField_int;
private static FieldInfo s_staticField_class;
private static FieldInfo s_staticField_struct;
public static int s_int;
public static object s_class;
public static MyBlittableStruct s_struct;

[GlobalSetup]
public void Setup()
Expand Down Expand Up @@ -68,8 +72,20 @@ public void Setup()
s_field_int = typeof(MyClass).
GetField(nameof(MyClass.i));

s_staticField_int = typeof(MyClass).
GetField(nameof(MyClass.s_i));

s_field_class = typeof(MyClass).
GetField(nameof(MyClass.o));

s_staticField_class = typeof(MyClass).
GetField(nameof(MyClass.s_o));

s_field_struct = typeof(MyClass).
GetField(nameof(MyClass.blittableStruct));

s_staticField_struct = typeof(MyClass).
GetField(nameof(MyClass.s_blittableStruct));
}

public static void Method_int_string_struct_class(int i, string s, MyBlittableStruct myStruct, MyClass myClass)
Expand Down Expand Up @@ -238,6 +254,15 @@ public void Field_Get_int()
}
}

[Benchmark(OperationsPerInvoke = Iterations)]
public void Field_GetStatic_int()
{
for (int i = 0; i < Iterations; i++)
{
s_int = (int)s_staticField_int.GetValue(null);
}
}

[Benchmark(OperationsPerInvoke = Iterations)]
public void Field_Get_class()
{
Expand All @@ -247,6 +272,34 @@ public void Field_Get_class()
}
}


[Benchmark(OperationsPerInvoke = Iterations)]
public void Field_GetStatic_class()
{
for (int i = 0; i < Iterations; i++)
{
s_class = s_staticField_class.GetValue(null);
}
}

[Benchmark(OperationsPerInvoke = Iterations)]
public void Field_Get_struct()
{
for (int i = 0; i < Iterations; i++)
{
s_struct = (MyBlittableStruct)s_field_struct.GetValue(s_MyClass);
}
}

[Benchmark(OperationsPerInvoke = Iterations)]
public void Field_GetStatic_struct()
{
for (int i = 0; i < Iterations; i++)
{
s_struct = (MyBlittableStruct)s_staticField_struct.GetValue(null);
}
}

[Benchmark(OperationsPerInvoke = Iterations)]
public void Field_Set_int()
{
Expand All @@ -256,6 +309,15 @@ public void Field_Set_int()
}
}

[Benchmark(OperationsPerInvoke = Iterations)]
public void Field_SetStatic_int()
{
for (int i = 0; i < Iterations; i++)
{
s_staticField_int.SetValue(null, 42);
}
}

[Benchmark(OperationsPerInvoke = Iterations)]
public void Field_Set_class()
{
Expand All @@ -265,6 +327,33 @@ public void Field_Set_class()
}
}

[Benchmark(OperationsPerInvoke = Iterations)]
public void Field_SetStatic_class()
{
for (int i = 0; i < Iterations; i++)
{
s_staticField_class.SetValue(null, 42);
}
}

[Benchmark(OperationsPerInvoke = Iterations)]
public void Field_Set_struct()
{
for (int i = 0; i < Iterations; i++)
{
s_field_struct.SetValue(s_MyClass, default(MyBlittableStruct));
}
}

[Benchmark(OperationsPerInvoke = Iterations)]
public void Field_SetStatic_struct()
{
for (int i = 0; i < Iterations; i++)
{
s_staticField_struct.SetValue(null, default(MyBlittableStruct));
}
}

public struct MyBlittableStruct
{
public int i;
Expand All @@ -279,9 +368,13 @@ public MyClass(int i, string s, MyBlittableStruct myStruct, MyClass myClass) { }
public void MyMethod() { }

public int i = 0;
public static int s_i = 0;
public bool b = false;
public string s = null;
public object o = null;
public static object s_o = null;
public MyBlittableStruct blittableStruct = default;
public static MyBlittableStruct s_blittableStruct = default;

public int I { get; set; } = 0;
public object O { get; set; } = null;
Expand Down