2010-12-29 10 views
0

Anyの拡張メソッドを使用したときのパフォーマンスが従来のforループの方法よりも向上していますか?リスト上のAnyなどを使用したときのパフォーマンスの向上

+0

「古いforループの方法」のサンプルを提供してください。どのようなループでも一般的に使用することができるので、enumerables上のすべての作業はわかりません。おそらく、私は疲れて何かを見逃しているでしょう。 –

答えて

4

要するに、パフォーマンスはわずかにより劣る可能性があります。

実際には、このアプローチの簡潔さと明快さは、ループよりも保守上の利点があり、バグが発生しにくくなります。それの

考えるこの方法:あなたは50個のループを書いて、そのうちの一つに短絡評価を忘れてしまった場合、あなたはあなたがインデックス付きのコレクションのために、すべての50

+0

**いくつかの追加の考え方、** **正しく使用されている場合、Parallel LINQはいくつかのパフォーマンス上の利点を提供するかもしれません。私はどこにでも 'AsParallel'を投げつけようとはしていません。しかし、それは考慮する別のオプションです。 – vcsjones

0

.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>のすべての要素を反復処理として、あっすべき性能利得が存在しない:これは、(反射を介して)フレームワークに実装することであろう。しかし、この方向の「最適化」は早すぎる最適化の対象となります。パフォーマンスに問題がある場合、この関数よりもアルゴリズムで修正される可能性が高くなります。

+0

'.Any()'を使うと、各項目に対して関数ポインタが呼び出されます。これにより、パフォーマンス上のペナルティが発生します。問題は、どのアプローチが高速になるかではありません(インライン 'foreach'は、関数ポインタ呼び出しの不足と、代理人が他にはできないコンパイラの最適化の可能性があるため確実に速くなります)早いforeachがあるでしょう。 – cdhowie

関連する問題