Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #68, АВГУСТ 2004 г.

220 на спидометре

Никита Кислицын

Xakep, номер #068, стр. 068-106-2


Чем это удобно?

Давай определимся с функциональностью системы. Действительно, что она позволяет делать? Прежде всего, она умеет вычислять производительность неограниченного количества блоков кода, которые могут динамически добавляться по ходу работы сценария. В конце работы программы система строит статистику по наблюдаемым кускам кода и показывает время, в течение которого они работали. Правда, красиво? Теперь все это структурировано, удобно и функционально. За пару минут в любой, даже самой сложной системе, можно найти кусок кода, который работает дольше всего, и начать его переписывать. Цель ясна, средства понятны - вперед!

Колбасим код

Давай подумаем, как это все реализовать. Я предлагаю такую схему. Мы создадим класс (чтобы избежать конфликтов в пространстве имен переменных, да и просто для красоты), который будет иметь 3 внешних метода: StartProc, StopProc и ShowStat. Первый будет принимать только один параметр - id, идентификатор блока кода, который может быть как числом, так и строковой константой, это совсем не важно. Этот метод добавляет в двумерный private-массив "proc" идентификатор процесса и время начала измерений, получаемое при помощи функции microtime. Метод StopProc принимает уже три параметра - идентификатор процесса, символическое название наблюдаемого блока кода и цвет, которым его следует выделить на диаграмме. Эта функция ищет в структуре "proc" по известному идентификатору время начала работы процесса, вычисляет общее время его работы и записывает в двумерный массив "kill" сведения о выполненном блоке кода - его символическое название, время работы и цвет, которым его надо выделить. Метод ShowStat строит статистику по отработавшим кускам кода, выводя и компонуя красивую html-табличку. Вот вкратце, как работает наш класс. Теперь рассмотрю подробнее, как это все реализуется на практике. Прежде всего, детская проблема. Функция microtime() возвращает свое значение в следующем формате: "0.50094600 1089107389", т.е. сначала идет дробная часть timestamp, а затем целая. Соответственно, как нам получить действительное число по этой последовательности? Правильно - надо разрезать эту строку по символу пробела, привести типы к float и сложить две полученные константы. Это делает функция mtime, которую ты можешь видеть на врезке с кодом. Кстати, пока не забыл. На врезке приведен обыкновенный линейный вариант программы - оформленную в качестве класса программу ты найдешь на диске. Массивы $proc и $kill являются в нашем случае внешними к создаваемым процедурам объектами, поэтому я выделил их директивами global. Метод StartProc добавляет в $proc элемент, состоящий из идентификатора процесса и времени начала его работы. При этом совершенно ясно, что число элементов всегда на единицу больше индекса последней ячейки (ведь нумерация начинается с 0!) и поэтому, получив при помощи count() число элементов, мы смело можем поместить в ячейку под этим номером добавляемый элемент. Метод StopProc действует аналогично - он ищет в массиве $proc по известному идентификатору время начала работы изучаемого процесса и добавляет в структуру kill элемент, соответствующий этому блоку. В нем указывается словесное название блока кода, время его работы и цвет, которым он будет визуально выделен при построении статистики. При этом заметь, как осуществляется поиск нужного элемента в proc.

Назад на стр. 068-106-1  Содержание  Вперед на стр. 068-106-3