Учебное пособие C#. Алгоритмы и структуры данных н. А. Тюкачев, В. Г. Хлебостроев издание третье, стереотипное 1 / 23
Листинг 1.2. Измерение времени выполнения с помощью Stopwatch
Download 1.85 Mb. Pdf ko'rish
|
C# Алгоритмы и структуры данных 2018 Тюкачев, Хлебостроев
- Bu sahifa navigatsiya:
- 1.3.2. И ЗМЕРЕНИЕ НА УРОВНЕ ПОТОКА ВЫПОЛНЕНИЯ . К ЛАСС
Листинг 1.2. Измерение времени выполнения с помощью Stopwatch
const int n = 10000; static void Main(string[] args) { int[] a = new int[n]; Random rnd = new Random(); for (int i = 0; i < n; i++) a[i] = rnd.Next() % 500; Stopwatch stpWatch = new Stopwatch(); stpWatch.Start(); 9 / 23 10 // здесь тестируемый код stpWatch.Stop(); Console.WriteLine("StopWatch: " + stpWatch.ElapsedMilliseconds.ToString()); Console.ReadLine(); } Описанный способ измерения времени выполнения программного кода имеет один существенный недостаток: предполагается, что в течение всего времени измерения процессор выполняет только этот код. Однако в многоза- дачных средах современных операционных систем это далеко не так. Далее будет описан другой способ измерения времени выполнения, свободный от указанного недостатка [40]. 1.3.2. И ЗМЕРЕНИЕ НА УРОВНЕ ПОТОКА ВЫПОЛНЕНИЯ . К ЛАСС T IMING Для загруженной на выполнение программы операционная система вы- деляет необходимые ресурсы (защищенную от доступа других процессов область оперативной памяти), создавая так называемый процесс. К числу этих ресурсов относится защищенная от других процессов область оператив- ной памяти, средства работы с файлами, часть процессорного времени. Для доступа к центральному процессору внутри процесса создается один или не- сколько потоков управления. В пределах каждого потока управления выпол- няется некоторый программный код. Центральный процессор по определен- ному алгоритму переключается между разными потоками выполнения, ими- тируя одновременный характер выполнения разных частей программы. Кро- ме того, часть потоков могут выполнять те или иные служебные действия, предписанные операционной системой. Одним из наиболее известных действий такого рода является сбор му- сора (garbаge collection). Так называется процесс удаления из динамической памяти ставших ненужными объектов. Этот процесс время от времени ини- циируется операционной системой и может прервать выполнение интере- сующей нас программы. Тогда значение измеренного времени выполнения окажется завышенным. Решение проблемы заключается в том, чтобы выпол- нить сбор мусора непосредственно перед началом измерения. Среда .Net Framework предоставляет специальный объект GC, с помощью которого можно обратиться к методам управления процессом сбора мусора. Так, ини- циировать процесс можно, обратившись к методу Collect(). Надо еще учесть, что удаление объекта может сопровождаться выполнением так назы- ваемого финализатора – метода, содержащего необходимые завершающие действия, например, закрытие файлов, с которыми работал удаляемый 10 / 23 11 объект. Метод WaitForPendingFinalizers() приостанавливает выпол- нение всех потоков до завершения работы финализаторов удаляемых объек- тов. Вернемся теперь непосредственно к проблеме измерения времени вы- полнения алгоритма. Реализующий его программный код выполняется одним из потоков управления в рамках процесса. Системный класс Process пре- доставляет средства работы с процессами, в частности, средства доступ к потокам через индексированное свойство Threads. Обращение к i-му пото- ку текущего (т.е. выполняющего данную программу) процесса имеет вид: Process.GetCurrentProcess.Threads [i]. Наконец, текущее время (как объект класса TimeSpan) в рамках конкретного потока выполнения можно получить, обратившись к свойству UserProcessorTime. Объединим все сказанное и создадим класс Timing, подобный классу Stopwatch , но с методами, более точно измеряющими время выполнения программного кода. Этот класс представлен в листинге 1.3. Download 1.85 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling