gpt4 book ai didi

c# - 使用 CustomAttributes 与 GetCustomAttributes() 的优势

转载 作者:太空狗 更新时间:2023-10-29 21:01:26 25 4
gpt4 key购买 nike

我今天注意到,我的 .NET 4.5 项目的 System.Type 对象的智能感知中出现了一些新属性。其中有一个称为 CustomAttributes

我对此很感兴趣,因为我之前了解到 GetCustomAttributes 是最昂贵的反射调用之一(当然,DynamicInvoke 等等)。据我了解,每次调用 GetCustomAttributes 都会导致调用属性的构造函数(从而进行内存分配)。我经常求助于单独缓存自定义属性,以避免在处理大量类型等时出现性能瓶颈。

因此,我编写了一个测试来查看 CustomAttributes 是否比 GetCustomAttributes 更高效:

static void Main(string[] args)
{
var sw = Stopwatch.StartNew();

Debug.WriteLine(typeof(Attributed).GetType());

for (int i = 0; i < 10000; i++)
{
var attrs = typeof(Attributed)
.CustomAttributes
.Select(a => a.AttributeType)
.ToList();
}

sw.Stop();
Debug.WriteLine("Using .NET 4.5 CustomAttributes property: {0}", sw.Elapsed);

sw = Stopwatch.StartNew();

for (int i = 0; i < 10000; i++)
{
var attrs = typeof(Attributed)
.GetCustomAttributes(true)
.Select(a => a.GetType())
.ToList();
}

sw.Stop();
Debug.WriteLine("Using GetCustomAttributes method: {0}", sw.Elapsed);
}

一些测试类:

[Dummy]
[Dummy]
[Dummy]
[Dummy]
[Dummy]
[Dummy]
class Attributed
{
}

[AttributeUsage(AttributeTargets.Class, AllowMultiple=true)]
class DummyAttribute : Attribute
{
public DummyAttribute()
{
}
}

结果令人惊讶:

System.RuntimeType
Using .NET 4.5 CustomAttributes property: 00:00:00.1351259
Using GetCustomAttributes method: 00:00:00.0803161

新的 CustomAttributes 属性实际上比现有的 GetCustomAttributes 方法慢!

进一步调试,我发现没有调用属性构造函数来迭代 CustomAttributes(这是我所期望的,因为它看起来只是在读取元数据)。然而不知何故,它比调用构造函数的 GetCustomAttributes 慢。

我的问题

我个人认为使用新属性更具可读性,但代价是性能降低 1.5 倍左右。

那么,使用 CustomAttributes 而不是 GetCustomAttributes() 有什么好处(如果有的话)?

我假设的情况是,我们只是检查类中是否存在某种类型的属性...而不是在属性的实例上使用方法或属性。

最佳答案

您犯了一个传统的基准测试错误,许多 .NET 程序员认为反射很慢。比实际速度慢。反射很偷懒,不用的时候不用付费。这使得您的第一个测量包括将元数据页面错误放入 RAM 和设置类型信息反射缓存的所有成本。该成本不包括在第二次测量中,使 GetCustomAttributes() 看起来比实际情况更好。

总是包含一个围绕基准代码的循环,运行它 10 次。您现在会看到 CustomAttributes 属性实际上并不慢,我测得(大约)0.083 秒和 0.063 秒,慢了约 30%。

需要在 .NET 4.5 中添加 CustomAttributes 属性以支持 WinRT 的语言投影。您不能在 Store、Phone 或 PCL 项目中使用 GetCustomAttributes()。 WinRT 中的反射非常不同,这是它作为基于 COM 的 api 的不可避免的副作用。实现代码足以让任何人眼睛流血,但大致的轮廓是属性是在 C# 中实现的,而方法是在 CLR 中实现的。 C# 代码需要做更多工作来处理语言投影细节,因此速度不可避免地会变慢。

所以只要继续使用 GetCustomAttributes(),必要时使用该属性。应用您的常识,30% 的速度差异并不是妥协风格和可读性的过分理由。

关于c# - 使用 CustomAttributes 与 GetCustomAttributes() 的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30632838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com