Contains
メソッドが要素を見つけるのArrayList
にかかる時間と、私が書いた小さな関数が同じことをするのにかかる時間との不一致を理解できません。ドキュメントにContains
は、線形検索を実行すると記載されているためO(n)
、他の高速な方法ではなく、そうであると想定されています。ただし、正確な値は関係ないかもしれませんがContains
、00:00:00.1087087
関数が00:00:00.1876165
. 大したことではないかもしれませんが、この違いはさらに大きな配列を扱う場合により顕著になります。何が欠けていますContains
か? のパフォーマンスに合わせて関数をどのように記述すればよいですか?
.NET 3.5 で C# を使用しています。
public partial class Window1 : Window
{
public bool DoesContain(ArrayList list, object element)
{
for (int i = 0; i < list.Count; i++)
if (list[i].Equals(element)) return true;
return false;
}
public Window1()
{
InitializeComponent();
ArrayList list = new ArrayList();
for (int i = 0; i < 10000000; i++) list.Add("zzz " + i);
Stopwatch sw = new Stopwatch();
sw.Start();
//Console.Out.WriteLine(list.Contains("zzz 9000000") + " " + sw.Elapsed);
Console.Out.WriteLine(DoesContain(list, "zzz 9000000") + " " + sw.Elapsed);
}
}
編集:
よし、さあ、みんな、見て。
public partial class Window1 : Window
{
public bool DoesContain(ArrayList list, object element)
{
int count = list.Count;
for (int i = count - 1; i >= 0; i--)
if (element.Equals(list[i])) return true;
return false;
}
public bool DoesContain1(ArrayList list, object element)
{
int count = list.Count;
for (int i = 0; i < count; i++)
if (element.Equals(list[i])) return true;
return false;
}
public Window1()
{
InitializeComponent();
ArrayList list = new ArrayList();
for (int i = 0; i < 10000000; i++) list.Add("zzz " + i);
Stopwatch sw = new Stopwatch();
long total = 0;
int nr = 100;
for (int i = 0; i < nr; i++)
{
sw.Reset();
sw.Start();
DoesContain(list,"zzz");
total += sw.ElapsedMilliseconds;
}
Console.Out.WriteLine(total / nr);
total = 0;
for (int i = 0; i < nr; i++)
{
sw.Reset();
sw.Start();
DoesContain1(list, "zzz");
total += sw.ElapsedMilliseconds;
}
Console.Out.WriteLine(total / nr);
total = 0;
for (int i = 0; i < nr; i++)
{
sw.Reset();
sw.Start();
list.Contains("zzz");
total += sw.ElapsedMilliseconds;
}
Console.Out.WriteLine(total / nr);
}
}
関数の 2 つのバージョン (順方向ループと逆方向ループ) と既定の関数で、平均 100 回の実行時間を記録しましたContains
。私が得た時間は、私の機能ではミリ秒で136
あり
、バージョン133
でははるかに勝者です。さて、データが不足していると主張する前に、最初の単独の実行に基づいて結論を出したとしたら、このテストについてどう思いますか? 平均してパフォーマンスが向上するだけでなく、実行ごとに一貫してより良い結果が得られます。では、サードパーティの機能に関して、ここになんらかの欠点がありますか?87
Contains
Contains