From dd20b85e265ddefcd7247ba537d125682b7a4316 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Wed, 31 Jan 2024 16:14:34 -0600 Subject: [PATCH 1/2] Add additional benchmarks for FieldInfo get\set --- .../micro/runtime/System.Reflection/Invoke.cs | 95 ++++++++++++++++++- 1 file changed, 94 insertions(+), 1 deletion(-) diff --git a/src/benchmarks/micro/runtime/System.Reflection/Invoke.cs b/src/benchmarks/micro/runtime/System.Reflection/Invoke.cs index 1f56d02d028..85bd5f8a02e 100644 --- a/src/benchmarks/micro/runtime/System.Reflection/Invoke.cs +++ b/src/benchmarks/micro/runtime/System.Reflection/Invoke.cs @@ -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() @@ -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) @@ -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(s_MyClass); + } + } + [Benchmark(OperationsPerInvoke = Iterations)] public void Field_Get_class() { @@ -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(s_MyClass); + } + } + + [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(s_MyClass); + } + } + [Benchmark(OperationsPerInvoke = Iterations)] public void Field_Set_int() { @@ -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(s_MyClass, 42); + } + } + [Benchmark(OperationsPerInvoke = Iterations)] public void Field_Set_class() { @@ -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(s_MyClass, 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(s_MyClass, default(MyBlittableStruct)); + } + } + public struct MyBlittableStruct { public int i; @@ -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; From 882b93565161b5078ee4670d2a4fd082e4ee7493 Mon Sep 17 00:00:00 2001 From: Steve Harter Date: Fri, 9 Feb 2024 11:59:25 -0600 Subject: [PATCH 2/2] Use null for static method 'obj' --- .../micro/runtime/System.Reflection/Invoke.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/benchmarks/micro/runtime/System.Reflection/Invoke.cs b/src/benchmarks/micro/runtime/System.Reflection/Invoke.cs index 85bd5f8a02e..c7606585cdc 100644 --- a/src/benchmarks/micro/runtime/System.Reflection/Invoke.cs +++ b/src/benchmarks/micro/runtime/System.Reflection/Invoke.cs @@ -259,7 +259,7 @@ public void Field_GetStatic_int() { for (int i = 0; i < Iterations; i++) { - s_int = (int)s_staticField_int.GetValue(s_MyClass); + s_int = (int)s_staticField_int.GetValue(null); } } @@ -278,7 +278,7 @@ public void Field_GetStatic_class() { for (int i = 0; i < Iterations; i++) { - s_class = s_staticField_class.GetValue(s_MyClass); + s_class = s_staticField_class.GetValue(null); } } @@ -296,7 +296,7 @@ public void Field_GetStatic_struct() { for (int i = 0; i < Iterations; i++) { - s_struct = (MyBlittableStruct)s_staticField_struct.GetValue(s_MyClass); + s_struct = (MyBlittableStruct)s_staticField_struct.GetValue(null); } } @@ -314,7 +314,7 @@ public void Field_SetStatic_int() { for (int i = 0; i < Iterations; i++) { - s_staticField_int.SetValue(s_MyClass, 42); + s_staticField_int.SetValue(null, 42); } } @@ -332,7 +332,7 @@ public void Field_SetStatic_class() { for (int i = 0; i < Iterations; i++) { - s_staticField_class.SetValue(s_MyClass, 42); + s_staticField_class.SetValue(null, 42); } } @@ -350,7 +350,7 @@ public void Field_SetStatic_struct() { for (int i = 0; i < Iterations; i++) { - s_staticField_struct.SetValue(s_MyClass, default(MyBlittableStruct)); + s_staticField_struct.SetValue(null, default(MyBlittableStruct)); } }