4. Снова вернитесь в окно Execution Profile (Профиль выполнения) (нажав для этого клавишу F6).
Мышь: Изменение размеров окна с помощью мыши происходит посредством перемещения по экрану маркера изменения размера, находящегося в нижнем правом углу.
Для того, чтобы переместить окно, необходимо зацепить заголовок этого окна или верхнюю или левую часть двойной рамки, ограничивающей окно и подтянуть окно в нужное место.
Между окном Execution Profile (Профиль выполнения) и окном Module (Модуль) автоматически поддерживается связь, поэтому когда Вы перемещаетесь по исходному тексту программы, содержимое окна Execution Profile (Профиль выполнения) все время соответствует тому участку программы на котором Вы находитесь в данный момент.
Для того, чтобы посмотреть этот механизм в действии необходимо сделать следующее:
1. Активируйте окно Execution Profile (Профиль выполнения) (нажав для этого F6) и переместите световой маркер на первую строку (статистика для строки 31 программы PRIME0, или строки 42 программы PRIME0PA).
2. Откройте локальное меню (нажмите для этого Alt-F10) и выберите команду Module (Модуль) (или просто нажмите Ctrl-M).
Профилировщик установит курсор в окне Module (Модуль) на строке 31.
3. При помощи клавиш управления курсором переместитесь на строку 22 исходного текста программы (строка 31 в PRIME0PA).
Эта строка занимает второе место по затратам времени в программе PRIME0. Теперь в двух верхних строках окна Execution Profile (Профиль выполнения) находятся данные профилирования для рассматриваемого оператора if.
4. Переместите курсор в окне Module (Модуль) на строку 21 (на строку 29 в PRIME0PA) и посмотрите как изменилось содержимое окна Execution Profile (Профиль выполнения). Верхние строки в окне Execution Profile (Профиль выполнения) теперь содержат статистику для 21 строки программы.
5. Переместите курсор на строку 30 (на строку 42 в PRIME0PA) и посмотрите на данные в окне Execution Profile (Профиль выполнения).
Наличие такой связи между двумя окнами облегчает нахождение участков Вашей программы, наиболее расточительно расходующих время ее выполнения. К тому же это может позволить избежать просмотра листинга профилирования (подобного рассмотренному ранее), в том случае если Вы предпочитаете анализировать данные, находящиеся на экране компьютера.
Сохранение конфигурации окон.
На данном этапе настал подходящий момент для того, чтобы запомнить изменения, произведенные в конфигурации системы Turbo Profiler. Если Вы не сохраните текущее расположение и размеры окон, то при следующем сеансе работы с профилировщиком окна опять примут положение и размеры, задаваемые по умолчанию.
1. Выберите команду Options|Save Options (Параметры|Сохранить параметры). На экране появится блок диалога Save Configuration (Сохранение конфигурации).
2. По умолчанию триггерные кнопки Options (Параметры), находящиеся в данном блоке диалога уже установлены, и все установленные параметры (такие, например, как параметры изображения окна Execution Profile (Профиль выполнения)) записываются в файл конфигурации.
3. В блоке диалога Save Configuration (Сохранение конфигурации) при помощи клавиши TAB переместитесь в Layout (Компоновка) и нажмите клавишу «пробел». В результате этого текущая компоновка окон «стык в стык» будет сохранена в файле конфигурации.
4. По умолчанию конфигурация записывается в файл TFCONFIG.TF, его имя уже установлено в блоке ввода Save To (Сохранить в).
Выберите ОК, или нажмите ENTER, для того чтобы сохранить Ваши параметры в текущей директории в файле с этим названием.
Как только Вы запускаете систему Turbo Profiler, она ищет файл TFCONFIG.TF, по умолчанию считается, что файл конфигурации имеет это имя. Как только профилировщик находит этот файл, он автоматически принимает конфигурацию, задаваемую параметрами, сохраненными в этом файле.
Измерение эффективности работы «области» программы.
Отношение общего времени, затраченного на работу данной «области» программы к числу передач управления на данную «область» является хорошей мерой для вычисления эффективности работы как одного оператора, так и всей программы.
Для того, чтобы посмотреть это отношение для «областей», определенных в PRIME0, измените параметр изображения для окна Execution Profile (Профиль выполнения). Это можно сделать следующим образом:
1. Из локального меню окна Execution Profile (Профиль выполнения) выберите команду Display (Изображение). (Для этого необходимо нажать комбинацию клавиш Alt-F10.)
2. В появившемся блоке диалога выберите значение Per Call (На один вызов) параметра Display (Изображение).
3. Выберите ОК (или нажмите ENTER).
Теперь Вы можете видеть, что строка 22 работает гораздо эффективнее строки 31 (в PRIME0PA строки 30 и 41 соответственно).
Несмотря на то, что общее время, затраченное на выполнение данной строки, велико, поскольку эта строка выполняется большое количество раз, среднее время ее выполнения составляет менее одной миллисекунды. Заметим, что среднее время выполнения строки 31 составляет приблизительно 38 миллисекунд (в PRIME0PA среднее время выполнения строки 42 равно 28 миллисекундам).
Данные, полученные профилировщиком показывают пути уменьшения времени работы PRIME0 и упрощения ее структуры. Можно выделить две стратегии улучшения программы:
1. Сокращение времени, затрачиваемого на выполнение операций ввода/вывода.
2. Изменение структуры операторов цикла на более эффективную и рациональную.
Проблема ввода/вывода может быть частично решена за счет сокращения оператора printf с его настоящего вида
printf(«prime #%d=%d\n», lastprime, curprime)
до вида
printf(«%d\n», curprime).
Информация для пользователей Паскаля: Вы можете привести оператор Writeln к виду Writeln(CurPrime);.
Только одно это простое изменение дает значительное уменьшение времени выполнения программы. Однако заметим, что Вы не можете уменьшить количество обращений к оператору вывода (в данном примере на экран каждый раз будет выводиться 168 простых чисел).
И, за исключением этого небольшого улучшения, Вы почти ничего не сможете сделать для ускорения работы PRIME0. Алгоритм этой программы, который требует сохранения всех предыдущих результатов в массиве с последующим использованием их для деления, совершенен настолько, что дальнейшее его улучшение практически невозможно.
(Заметим, что данный алгоритм не очень эффективен с точки зрения использования памяти, так как наличие массива требует резервирования памяти, размеры которой должны позволить разместить все найденные простые числа. Из вышеизложенного следует ограничение на количество простых чисел, которые могут быть найдены данной программой, поскольку при некотором их количестве неизбежно произойдет переполнение оперативной памяти.)
К счастью существует более оптимальный способ поиска простых чисел, но для того, чтобы им воспользоваться необходимо полностью изменить алгоритм, что и демонстрируется в следующем примере, в программе PRIME1.
Модульная программа поиска простых чисел (PRIME1).
Завершим рассмотрение PRIME0 и загрузим в окно Module (Модуль) программу PRIME1, следующий вариант программы поиска простых чисел. Начнем изучение этой программы с простого просмотра ее текста.
1. Выберите команду File|Open (Файл|Открыть).