C # Почему время выполнения метода не то же самое? - PullRequest
2 голосов
/ 22 марта 2012

Если я измеряю время выполнения метода, не должно ли оно быть одинаковым, если я даю одинаковые входные данные? Я использовал секундомер:

Stopwatch sw = new Stopwatch();
sw.Start();
//code here
sw.Stop();
label3.Text = "Running Time:"+sw.Elapsed.TotalMilliseconds;

Ответы [ 8 ]

7 голосов
/ 22 марта 2012

Трудно сказать без кода.

Вы могли видеть различия по нескольким причинам - это далеко не полный список:

  1. Компьютер занят - ваш компьютер делает что-то еще, что означает, что он дает вашему коду меньше ресурсов (время процессора).
  2. I / O - вы делаете какой-то ввод-вывод, который может занять некоторое время или долгое время.
  3. Jitting - при первом запуске метода JIT-компилятор компилирует его, и на это требуется время. Во второй раз это займет намного меньше.
  4. Кэширование попаданий и промахов - если вы измеряете один и тот же код дважды, второй раз может быть быстрее, поскольку данные, используемые кодом, уже находятся в кэше.
4 голосов
/ 22 марта 2012

Нет, совсем нет.Ваша программа работает в сложной системе - компьютере, на котором запущено много других процессов, прерывающих вашу программу для заимствования ЦП в неурочные моменты.И даже в вашей программе есть другие потоки, которые могут украсть циклы здесь и там.Контрольные показатели всегда должны быть статистическими - измерять много раз и брать среднее значение.

2 голосов
/ 22 марта 2012

Нет.

Существует много факторов, влияющих на время:

  • Другие запущенные процессы
  • Доступные ресурсы
  • Другие запущенные потокив вашем процессе сражаются за те же ресурсы
  • Если GC активируется во время выполнения метода
  • Аппаратное обеспечение вашей машины
  • ....
2 голосов
/ 22 марта 2012

Нет, потому что другие программы на вашем компьютере также используют процессор.Таким образом, даже если его код совпадает, среда на вашем компьютере может измениться.Это может быть много сетевого трафика, некоторые фоновые задачи и т. Д.

1 голос
/ 22 марта 2012

Нет, поскольку на вашем компьютере запущено несколько других событий, которые влияют на время вашего секундомера.

Просто небольшой список:

  • Другой процесс на вашем компьютере требует времени ЦПи ваш процесс / поток менее важен, чем этот процесс
  • То же самое со всеми аппаратными вызовами, такими как запись на жесткий диск, рисование графики и т. д.
  • Вы вызываете этот метод / класс в первый раз иJIT-компилятор запускается перед его выполнением
  • Ваша куча была израсходована, и ваше приложение запрашивает новую память, иначе сборщик мусора собирает и освобождает все устаревшие данные
  • ваш процессор начал снижение мощностии работает с более низкой скоростью
  • и еще больше больше ...

Такое сравнение производительности обычно вызывается одним и тем же методом, одни и те же параметры в течение нескольких раз в цикле из-завсе эти влияния.

1 голос
/ 22 марта 2012

Это зависит от количества процессов, запущенных в данный момент на вашем процессоре. Если у вас большая нагрузка на процессор, тогда я могу занять некоторое время. Но не будет большой разницы.

1 голос
/ 22 марта 2012

Так много всего происходит как внутри кода, так и на компьютере. Вам повезет каждый раз получать одни и те же результаты.

1 голос
/ 22 марта 2012

Это никогда может быть точно одинаковым.Там всегда будут вариации.На вашем компьютере запускается не только ваша программа, есть ОС и другие программы, сервисы тоже.

Важно то, что тоже большой разницы не видноТо есть.

...