- •1. Лекция: Язык программирования и среда разработки. Цели курса
- •Язык c#
- •Будущее с#
- •Открытость
- •Framework .Net - единый каркас среды разработки приложений
- •Библиотека классов fcl - статический компонент каркаса
- •Единство каркаса
- •Встроенные примитивные типы
- •Структурные типы
- •Архитектура приложений
- •Модульность
- •Общеязыковая исполнительная среда clr - динамический компонент каркаса
- •Двухэтапная компиляция. Управляемый модуль и управляемый код
- •Виртуальная машина
- •Дизассемблер и ассемблер
- •Метаданные
- •Сборщик мусора - Garbage Collector и управление памятью
- •Исключительные ситуации
- •События
- •Общие спецификации и совместимые модули
- •Linq и деревья выражений
- •Другие новинки
- •Управляемый и неуправляемый код
- •Проекты c# в Visual Studio 2008
- •Создание проекта
- •Определение основных понятий
- •Класс (Class)
- •Объект (Object)
- •Пространство имен (Namespace)
- •Проект (Project)
- •Сборка (Assembly)
- •Решение (Solution)
- •Постановка задачи
- •Создание dll - проекта типа "Class Library"
- •Вычисление конечных и бесконечных сумм
- •Консольный проект
- •Начало начал - точка "большого взрыва"
- •Связывание с dll
- •Организация консольного интерфейса
- •Windows- проект
- •Построение интерфейса формы
- •Как оценить время работы метода
- •Предварительные сведения о делегатах - функциональном типе данных
- •Класс TimeValue
-
Как оценить время работы метода
Давайте подумаем, как можно оценить время работы метода класса или отдельного фрагмента кода. Во-первых, можно провести теоретическую оценку. Например, для функции , как мы видели, на одном шаге цикла требуется около 10 операций (не учитывая разную сложность операций). Число итераций зависит от значения аргумента. Максимальное значение аргумента по модулю не превышает , но и в этом случае 15 итераций достаточно, чтобы текущий член суммы по модулю стал меньше . Современному компьютеру средней мощности с частотой 1,6 GHz потребуется менее 1 секунды для вычисления функции при числе повторов .
Чем считать операции, зачастую проще непосредственно измерить реальное время вычислений. В библиотеке CLR для этих целей создан класс DateTime, позволяющий работать с датами и временами. У этого класса есть замечательный статический метод Now, вызов которого возвращает в качестве результата объект класса DateTime, задающий текущую дату и текущее время (по часам компьютера). Многочисленные свойства этого объекта - Year, Month, Hour, Second и многие другие позволяют получить все характеристики даты и текущего времени. Текущее время можно также измерять и в единицах, называемых "тиками", где один тик равен 100 наносекунд или, что, то же, секунды.
Имея в своем арсенале такой класс, не составит большого труда измерить время, требуемое на выполнение некоторого участка кода. Достаточно иметь две переменные с именами, например, start и finish класса DateTime. Переменой start присвоим значение, возвращаемое функцией Now перед началом измеряемого участка кода, а переменной finish - в конце участка кода. Разность времен даст нам требуемую оценку длительности выполнения кода.
Некоторый недостаток этого подхода состоит в том, что рабочий код нужно дополнять операторами, задействованными только для проведения исследований. Поэтому хочется иметь более удобный инструментарий. Покажу возможный образец построения подобного инструмента. Поместив его в созданную нами библиотеку классов DLL MathTools, обеспечим тем самым возможность повторного использования.
Добавим в эту библиотеку новый класс. Вот описание этого класса, пока пустого, но содержащего заголовочный комментарий:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MathTools
{
/// <summary>
/// Класс спроектирован для получения оценок времени
/// выполнения различных методов.
/// Встроенные делегаты определяют сигнатуры методов
/// </summary>
public class TimeValue
{
}
}
Уточним нашу цель. Мы хотим создать удобный инструмент, позволяющий оценивать время работы исследуемых методов. Вместо того чтобы в работающей программе окружать вызовы этих методов специальными операторами, напишем специальную процедуру, производящую оценку времени работы, передавая ей в качестве параметра имя исследуемого метода. Стоит сказать несколько слов о том, как написать процедуру (метод), которой в качестве параметра можно передавать имя метода.