gpt4 book ai didi

c# - 通用方法与非通用方法 - 有任何性能优势吗?

转载 作者:行者123 更新时间:2023-11-30 12:13:01 25 4
gpt4 key购买 nike

我正在用 C# 创建我的第一个网站。

我注意到我在智能感知中得到了一些重复的扩展方法。进一步调查是这两个:

public static void ThrowNullOrEmpty<T>(this IEnumerable<T> obj, string param)
{
}

public static void ThrowNullOrEmpty(this string obj, string param)
{
}

好像string也可以是IEnumerable<char> .

从编译的基础上我可以删除字符串变体,但是是否存在任何性能问题或其他我应该注意的问题?

更新

刚刚测试了超过 100 万次迭代。

public bool IsNullOrEmpty1(string @this)
{
return String.IsNullOrEmpty(@this);
}

对比

public bool IsNullOrEmpty2<T>(IEnumerable<T> @this)
{
return @this == null || !@this.Any();
}

IsNullOrEmpty1 在我的开发机器 IsNullOrEmpty2(125 - 250 毫秒)上的时钟为 12 毫秒,因此慢了 10 - 20 倍。

在现实世界中,我采用了每月 3000 万次迭代的极高数字,换算成每分钟 1388 次(每天 12 小时)。结果两者都不到 1 毫秒。

因此,删除 IsNullOrEmpty1 不是最好的方法,但它也不是站点 killer 。

最佳答案

这可能取决于这些方法的实现——字符串版本可以针对性能进行优化,而 IEnumerable<T>一个需要更通用。调用泛型方法没有开销,它已经在编译时解析为正确的泛型参数。

字符串版本可以这样实现,开销很小(基本上需要做两次比较):

if (String.IsNullOrEmpty(value))  

IEnumerable<T>另一方面可能必须实现类似的东西:

if (value == null || !value.Any())

这里的关键是Any将调用 GetEnumerator 方法并返回枚举器的调用。 (为简单起见,我们将在这里忽略框架可能在内部对某些类型使用的性能优化)。这意味着该实现实际上创建了一个新对象,稍后需要对其进行垃圾收集——与进行 string 中提到的两次比较相比,两者都需要更多的时钟周期。版本。

在实践中,除非非常频繁地调用这些方法,否则我怀疑是否存在任何显着的性能差异。

顺便说一句,之所以可行,是因为 string是一个 IEnumerable<char> .

关于c# - 通用方法与非通用方法 - 有任何性能优势吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12446196/

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