これら二つの質問は、IEnumerableをシャッフルするために同様のalgorthimsを与える:ここで IEnumerableをシャッフルするためのこれらの2つのアルゴリズムのパフォーマンスに違いはありますか?
- C#: Is using Random and OrderBy a good shuffle algorithm?
- Can you enumerate a collection in C# out of order?は2つの方法ですサイド・バイ・サイド:彼らはある
public static IEnumerable<T> Shuffle1<T> (this IEnumerable<T> source) { Random random = new Random(); T [] copy = source.ToArray(); for (int i = copy.Length - 1; i >= 0; i--) { int index = random.Next (i + 1); yield return copy [index]; copy [index] = copy [i]; } } public static IEnumerable<T> Shuffle2<T> (this IEnumerable<T> source) { Random random = new Random(); List<T> copy = source.ToList(); while (copy.Count > 0) { int index = random.Next (copy.Count); yield return copy [index]; copy.RemoveAt (index); } }
基本的に同一ですが、
List
を使用し、1つは配列を使用します。概念的には、第2のものは私には明らかです。しかし、配列を使用することで得られる大きなパフォーマンス上の利点はありますか?たとえBig-Oの時間が同じであっても、それが数倍速ければ、それは顕著な違いを作り出すことができる。
あなたは両方の方法でコードを書いています。どちらが速いかを知りたければ*コードを実行してください。なぜ多くの人々が「これらのうちのどれが速いのですか」と投稿するのは、私にとって謎です。質問。確かに、あなたの机の上に座っている間にインターネットに尋ね、他の誰かがあなたのためにそれを実行するのを待つか、推測するよりも、両方の方法でコードを実行するだけで、より速く正確になる必要があります。 –
@Matthewは常にあなた自身のベンチマークを掲示し、その理由をよりよく尋ねます。 – nawfal