Понимание разницы между запуском счетчика времени в коде и счетчика времени вне кода - PullRequest
3 голосов
/ 06 марта 2011

OK.Название этого вопроса нелегко расшифровать, но позвольте мне объяснить вам.

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

Платформа: .NET Framework 4.0 Система: Windows (очевидно) Язык: F #

Мне нужно запустить программу и оценить время, затраченное на выполнение некоторых инструкций.Предположим, у вас есть основная функция, там вы разместите счетчик времени:

open System.Diagnostics
let main args =
   let watch = new Stopwatch ()
   watch.Start ()
   (* Calling functions and executing main body... *)
   watch.Stop ()
   (* Printing out the evaluated time *)

ОК!У меня есть время, и я счастлив.

Теперь я хочу измерить это время, но оцениваю его со стороны.Итак, рассмотрим сценарий PowerShell, который запускает файл, но также считает время:

$MyProcess = New-Object "System.Diagnostics.Process";
$Watch = New-Object "System.Diagnostics.Stopwatch";
$MyProcess.StartInfo.FileName = "Myexec";
$MyProcess.StartInfo.Arguments = "args";
$MyProcess.StartInfo.CreateNoWindow = $true;
$MyProcess.StartInfo.UseShellExecute = $false;
$StartingTimer = $Watch.Start(); # Starts the timer
$StartingProcess = $MyProcess.Start();
$WaitingForExit = $MyProcess.WaitForExit();
$StoppingTimer = $Watch.Stop(); # Stops the timer
# Collectiong timings
$Ticks = $Watch.ElapsedTicks;
# Returning and printing
Write-Output "$Ticks";

Хорошо.У меня такой вопрос: как вы видите, у нас есть два разных типа оценки: в коде и вне кода.Я думаю, что те времена разные !!!Поскольку таймер внешнего кода оценивает некоторые инструкции, которые не конкурируют с программой, которую я должен оценить.Например, переключение контекста и т. Д. В таймере внешнего кода, если процессор испытывает переключение контекста, я буду оценивать время, которое требуется другому процессу для завершения во время его сегмента контекста ...

Это так?Я прав?

Ответы [ 2 ]

5 голосов
/ 06 марта 2011

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

Оба измерения будут измерять время настенных часов, включая переключение контекста,ожидание ввода / вывода, ввода данных пользователем и т. д.

Если вы хотите измерить фактическую загрузку ЦП (например, столбец «Время ЦП» в TaskManager), вам нужно посмотреть в классе System.Diagnostics.Processгде у вас есть доступ к TotalProcessorTime и т. д.

Если вы хотите проверить свой собственный процесс, вы можете найти ссылку на него с помощью Process.GetCurrentProcess().

1 голос
/ 06 марта 2011

В Powershell вы можете получить фактическое время процессора, использовав

  (get-process -ID $PID).cpu

до и после запуска команд.

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

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