Как измерить фактическое время, затраченное ЦП на выполнение кода с помощью секундомера? - PullRequest
0 голосов
/ 16 января 2019

Часть моего проекта для обучения использует секундомер для измерения времени.

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

Интересно, если я поставлю много длинных задач, будет ли эта мера точный.

Пример кода идеи:

public static void run(){
    var tasks= new List<Task<int>>();

    foreach(var task in taskList) //taskList is global object with 10 variables inside
        tasks.Add(Task.Factory.StartNew<int>(()=>taskFunction(task)));

    Task.WaitAll(tasks.ToArray());
}

private int taskFunction(task) {
    Stopwatch watch = new Stopwatch();

    while (watch.ElapsedMilliseconds < MaxTime * 1000)
    {
        watch.Start();
        doSomething(); // takes lot of time;
        watch.Stop();

        doSomethingDiffrent();
    }
}

Итак, я создам около 10 заданий. Если задача не рассчитывается процессором, время в секундомере будет запущено и потрачено впустую?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Если вы находитесь в режиме отладки, вы можете использовать средства диагностики

Пока ваше приложение запущено, перейдите в меню:

Отладка -> Windows -> Показать средства диагностики

0 голосов
/ 16 января 2019

Если задача не рассчитана процессором, время в работе секундомера будет потрачено впустую.

Если вы посмотрите на исходный код System.Diagnostics.Stopwatch, вы увидите, что он на самом деле не работает, нет потерь. У него есть две отметки времени start и end, и он фактически подсчитывает elapsed, вычисляя и добавляя периоды между ними. Обратите внимание, что вы можете запускать и останавливать Stopwatch несколько раз, он будет измерять суммарный период между этими прогонами. Таким образом, ответ будет да , он также вычислит время, когда поток неактивен.

Также от Microsoft вы должны быть осторожны при запуске Stopwatch в многопроцессорной среде:

На многопроцессорном компьютере не имеет значения, на каком процессоре работает поток. Однако из-за ошибок в BIOS или на уровне аппаратных абстракций (HAL) вы можете получить разные результаты синхронизации на разных процессорах. Чтобы указать привязку процессора к потоку, используйте метод ProcessThread.ProcessorAffinity.


С другой стороны, если вы хотите измерить, сколько времени ЦП потратил на выполнение кода, взгляните на следующую ссылку: ExecutionStopwatch . Он в основном использует использование GetThreadTimes и измеряет, сколько времени потратил поток, работая вместе в режиме ядра или пользователя.

...