Skip to content

Reflection performance in NativeAOT #66620

@AhmedZero

Description

@AhmedZero

Description

when I use the following example without NativeAOT, it's very fast, but with NativeAOT, I found it's very slow.

using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Reflection;
namespace MyApp 
{

public static class Utils
 {
     public static string GetDescription(this Enum value)
     {
         FieldInfo field = value.GetType().GetField(value.ToString());

         DescriptionAttribute attribute
                 = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute))
                     as DescriptionAttribute;

         return attribute == null ? value.ToString() : attribute.Description;
     }
 }
internal unsafe class Program
 {
     public enum Item
     {
         [Description("Zero")]
         Useless,
         [Description("Test--1")]
         Test1,
         [Description("Test--2")]
         Test2,
         [Description("Test--3")]
         Test3,
         [Description("Test--4")]
         Test4,
         [Description("Test--5")]
         Test5,
         [Description("Test--6")]
         Test6,
         [Description("Test--7")]
         Test7,
         [Description("Test--8")]
         Test8,
         [Description("Test--9")]
         Test9,
         [Description("Test--10")]
         Test10,
         [Description("Test--11")]
         Test11,
         [Description("Test--12")]
         Test12,
         [Description("Test--13")]
         Test13,
         [Description("Test--14")]
         Test14,
         [Description("Test--15")]
         Test15,
         [Description("Test--16")]
         Test16,
         [Description("Test--17")]
         Test17,
         [Description("Test--18")]
         Test18,
         [Description("Test--19")]
         Test19,
         [Description("Test--20")]
         Test20,
         [Description("Test--21")]
         Test21,
         [Description("Test--22")]
         Test22,
         [Description("Test--23")]
         Test23,
         [Description("Test--24")]
         Test24,
         [Description("Test--25")]
         Test25,
         [Description("Test--26")]
         Test26,
         [Description("Test--27")]
         Test27,
         [Description("Test--28")]
         Test28,
         [Description("Test--29")]
         Test29,
         [Description("Test--30")]
         Test30,
         [Description("Test--31")]
         Test31,
         [Description("Test--32")]
         Test32,
         [Description("Test--33")]
         Test33,
         [Description("Test--34")]
         Test34,
         [Description("Test--35")]
         Test35,
         [Description("Test--36")]
         Test36
     }

     static void Main(string[] args)
     {
         Stopwatch sw = new Stopwatch();
         sw.Start();
         List<string> test1 = new List<string>();
         for (int i = 0; i < 100000; i++)
         {
             test1.Add(Item.Test36.GetDescription());
         }
         sw.Stop();
         Console.WriteLine("First Example: " + sw.ElapsedTicks);
         sw.Restart();
         sw.Start();
         List<string> test2 = new List<string>();
         for (int i = 0; i < 100000; i++)
         {
             test2.Add("test--36");
         }
         sw.Stop();
         Console.WriteLine("Second Example: " + sw.ElapsedTicks);

         Console.ReadKey();
     }
}
}

Output

Without NativeAOT

First Example: 1711806
Second Example: 10042

With NativeAOT

First Example: 5760899
Second Example: 20363

Configuration

Win-x64
.NET 6

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status

    No status

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions