Время, необходимое для завершения процесса - PullRequest
5 голосов
/ 05 апреля 2010

Я новичок в мире C #. Я пытаюсь вычислить время, затраченное алгоритмом для сравнения. Следующий код измеряет время, прошедшее с момента вызова подпрограммы до возврата подпрограммы в основную программу. Этот пример взят из «Структуры данных через C #» Майкла Макмиллана. После запуска этой программы на выходе отображается Time = 0, что неверно. Программа выглядит логически правильной. Кто-нибудь может мне помочь. Ниже приведен код

 using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Chap1
{
    class chap1
    {
        static void Main()
        {
            int[] nums = new int[100000];
            BuildArray(nums);
            Timing tObj = new Timing();
            tObj.startTime();
            DisplayNums(nums);
            tObj.stopTime();
            Console.WriteLine("Time: " + tObj.result().TotalSeconds);
            Console.WriteLine("Start Time: " + tObj.startTime().TotalSeconds);
            Console.WriteLine("Duration : " + tObj.result().TotalSeconds);
            Console.ReadKey();
        }
        static void BuildArray(int[] arr)
        {
            for (int i = 0; i <= 99999; i++)
                arr[i] = i;
        }
        static void DisplayNums(int[] arr)
        {
            for (int i = 0; i <= arr.GetUpperBound(0); i++)
                Console.WriteLine(arr[i]);
        }
    }
class Timing
    {
        TimeSpan StartTiming;
        TimeSpan duration;
        public Timing()
        {
            StartTiming = new TimeSpan(0);
            duration = new TimeSpan(0);
        }
        public TimeSpan startTime()
        {
            GC.Collect();


     GC.WaitForPendingFinalizers();
            StartTiming = Process.GetCurrentProcess().Threads[0].UserProcessorTime;
            return StartTiming;
        }
        public void stopTime()
        {
            duration = Process.GetCurrentProcess().Threads[0].UserProcessorTime.Subtract(StartTiming);

        }
        public TimeSpan result()
        {
            return duration;
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 05 апреля 2010

Класс Секундомер предназначен для этого.

UserProcessorTime не имеет разрешения, необходимого для измерения счета до 100000 в цикле for. Ваши вызовы WriteLine не будут включены во время пользователя, поскольку они являются временем ввода-вывода. Возможно, ваш код не работает в потоке 0. Время пользователя не обновляется, кроме случаев переключения контекста. Когда вы печатаете startTime, вы меняете сохраненное значение. Возможно, есть и другие вещи, которые могут пойти не так, как я думал.

Я настоятельно рекомендую вам использовать класс Секундомер, который использует счетчики производительности процессора.

2 голосов
/ 05 апреля 2010

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

Обновление по новому коду:

Не запускайте его в режиме отладки ... создайте версию выпуска и запустите исполняемый файл вручную: http://social.msdn.microsoft.com/forums/en-US/vbgeneral/thread/3f10a46a-ba03-4f5a-9d1f-272a348d660c/

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

...