[英]Any performance gain when using Any etc on List
使用比舊的for循環方式更多的擴展方法時,性能會有所提高嗎?
簡而言之,沒有; 性能很可能是稍微較差。
在實踐中,這種方法的簡潔性和清晰性將在循環中具有維護優勢,並且不易出現錯誤。
可以這樣考慮:如果您編寫了50個循環而忘記在其中一個循環中進行短路評估,那么在全部50個循環中最好使用.Any
。
對於索引集合,您可以執行以下操作:
for(int i = 0; i < col.Length;i++)
{
if (predicate(col[i]))
return true;
}
return false;
但是對於非索引的IEnumerable<T>
,這是不可能的,因為它不提供索引器。 這將是框架中的實現(通過反射):
public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
foreach (TSource local in source)
{
if (predicate.Invoke(local))
{
return true;
}
}
return false;
}
當迭代IEnumerable<T>
所有元素時,不會有性能提升。 但是,此方向上的任何“優化”都屬於過早優化,如果存在性能問題,則在此算法中比在此函數中更可能修復該問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.