C # Производительность странный случай - PullRequest
4 голосов
/ 22 февраля 2012

Я тестировал некоторые случаи в C #, чтобы рассмотреть некоторые важные аспекты производительности. Во время тестирования я столкнулся со странным случаем

 for (int i = 0; i < 30; i++)
 {
     DateTime d = DateTime.Now;
     print();
     result.Add  ((DateTime.Now - d));
 }

 foreach(TimeSpan t in result)
     Console.WriteLine(t.ToString());

, тогда как функция печати была просто:

public static void print ()
{
     for (int i = 0; i < 10000; i++)
     {
         Console.WriteLine( string.Format("{0}", i));       
     }
}

Я был шокирован результатами, в то время как первые три цикла это заняло около 5 секунд, а после этого - около 0,5 секунды.Вот некоторые из них:

00:00:05.6212696
00:00:05.6072002
00:00:05.5837965
00:00:01.9451673
00:00:00.5526335
00:00:00.5540554
00:00:00.5676418
00:00:00.5372442
00:00:00.5772550

Я просто хочу знать, почему после третьей итерации оно улучшилось почти в 10 раз?

Ответы [ 2 ]

8 голосов
/ 22 февраля 2012

Ваше узкое место здесь будет Console.WriteLine.Это может повлиять на разные вещи, но, в частности, если вы свернете окно или что-то подобное, это может массово ускорить процесс.

Вы уверены, что действительно измеряете что-нибудь полезное?Ваше приложение реального мира много пишет на консоли?

Обратите внимание, что обычно лучше использовать Stopwatch, чем DateTime.Now для измерения производительности, хотя это не будетбольшая разница здесь.

3 голосов
/ 22 февраля 2012

Я просто запустил тот же код на моем ПК и получил следующий вывод:

00:00:00.0469083
00:00:00.0312722
00:00:00.0312722
00:00:00.0469083
00:00:00.0312722
00:00:00.0312722
00:00:00.0312722
00:00:00.0469083

....

Как видите, заметной разницы нет. Я бы предложил, во-первых, не терять время на проверка производительности в таких случаях, поскольку она может варьироваться от ПК к ПК, и повторение предложения Джона использовать StopWatch для более точного измерения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...