
- •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
{
}
}
Уточним нашу цель. Мы хотим создать удобный инструмент, позволяющий оценивать время работы исследуемых методов. Вместо того чтобы в работающей программе окружать вызовы этих методов специальными операторами, напишем специальную процедуру, производящую оценку времени работы, передавая ей в качестве параметра имя исследуемого метода. Стоит сказать несколько слов о том, как написать процедуру (метод), которой в качестве параметра можно передавать имя метода.