1
私は、プロジェクトが何百万ものオブジェクトをループするので、本質的に高速であるかどうかを調べるためにループで簡単なテストを行っています。このテストでは、Listに1ミリオンのオブジェクトがあり、それぞれにMyClass.Ageプロパティが設定されます。私は各オブジェクトをループし、Ageプロパティを引き出します。私はForeachループとForループでこれを行います。誰かが奇妙な結果を説明したり、私は愚かなエラーを作ったことを私に示して...おかげForeach対Forループ異常な結果
static int trial = 1;
static void Main(string[] args)
{
while (Console.ReadKey().Key == ConsoleKey.Enter)
{
Run();
trial++;
}
}
private static void Run()
{
Console.WriteLine();
Console.WriteLine("Trial " + trial.ToString());
List<MyClass> classes = new List<MyClass>();
for (int x = 1; x <= 1000000; x++)
{
classes.Add(new MyClass(x));
}
DateTime startTime = new DateTime();
DateTime endTime = new DateTime();
DateTime startTime2 = new DateTime();
DateTime endTime2 = new DateTime();
startTime = DateTime.Now;
foreach (MyClass c in classes)
{
int age = c.Age;
}
endTime = DateTime.Now;
TimeSpan span = endTime - startTime;
Console.WriteLine("ForEach Time: " + span.TotalMilliseconds.ToString("#,##0.00000").PadLeft(10) + "ms");
startTime2 = DateTime.Now;
for (int x = 0; x < classes.Count; x++)
{
int age = classes[x].Age;
}
endTime2 = DateTime.Now;
TimeSpan span2 = endTime2 - startTime2;
Console.WriteLine("ForLoop Time: " + span2.TotalMilliseconds.ToString("#,##0.00000").PadLeft(10) + "ms");
}
class MyClass
{
public int Age;
public MyClass(int a)
{
Age = a;
}
}
結果してくださいすることができます
Trial 1
ForEach Time: 15.60000ms
ForLoop Time: 0.00000ms
Trial 2
ForEach Time: 0.00000ms
ForLoop Time: 15.60000ms
Trial 3
ForEach Time: 15.60000ms
ForLoop Time: 0.00000ms
Trial 4
ForEach Time: 15.60000ms
ForLoop Time: 0.00000ms
Trial 5
ForEach Time: 15.60010ms
ForLoop Time: 0.00000ms
Trial 6
ForEach Time: 0.00000ms
ForLoop Time: 0.00000ms
Trial 7
ForEach Time: 15.60000ms
ForLoop Time: 0.00000ms
Trial 8
ForEach Time: 15.60010ms
ForLoop Time: 0.00000ms
Trial 9
ForEach Time: 0.00000ms
ForLoop Time: 15.60010ms
Trial 10
ForEach Time: 0.00000ms
ForLoop Time: 0.00000ms
それを修正しました。 Datetimeの理由を洞察してもらえますか? – user2777664
@ user2777664、そうです。この記事をチェックするhttp://stackoverflow.com/questions/2923283/stopwatch-vs-using-system-datetime-now-for-timing-events(OR)MSDNのドキュメント。要するに、 'stopwatch'は' DateTime.Now'よりも精度が高いです – Rahul
ありがとう!それは有り難いです。 – user2777664