Система Turbo Profiler фирмы Borland
- Название:Система Turbo Profiler фирмы Borland
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Система Turbo Profiler фирмы Borland краткое содержание
Система Turbo Profiler фирмы Borland - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Если в окне Execution Profile (Профиль выполнения) временная и количественная статистика показываются одновременно, то некоторые сочетания этих данных заслуживают внимания. Для неэффективных подпрограмм вторая строка гистограммы (временные данные) гораздо длиннее, чем первая (количественные данные), это означает, что отношение времени выполнения к количеству вызовов велико. Именно такая ситуация наблюдается в строке 27, оператор printf (в Паскалевской программе это строка 28).
В том случае, если для какой-то подпрограммы отношение общего времени ее выполнения к количеству ее вызовов велико, то самое лучшее из того, что можно предпринять — это попытаться заменить ее на другую подпрограмму.
Рассматривая оператор return в подпрограмме root (строка 7), мы попадаем в другую ситуацию. Этот оператор характеризуется самым большим числом обращений и самым большим общим временем выполнения. К двум другим строкам (строке 5 и строке 8) обращение происходит 5456 раз, но гистограммы для каждой из этих строк показывают маленькие затраты времени на их выполнение. Такое сочетание нас вполне устраивает, оно означает, что данные операторы работают быстро. Итак, самой большой проблемой на настоящий момент является количество вызовов подпрограммы root.
Сокращение количества вызовов подпрограммы (PRIME3).
Теперь наша основная задача — это сокращение количества вызовов подпрограммы root. Загрузите PRIME3 в окно Module (Модуль), затем распахните это окно и посмотрите на исходный текст нашего примера.
Информация для пользователей Паскаля: Вам следует загрузить в окно Module (Модуль) пример PRIME3PA.
Единственная модификация, имеющаяся в PRIME3, содержится в подпрограмме prime. Мы добавили новую целочисленную переменную limit и, перед началом работы цикла for, присвоили ей значение, равное root(n). Переменная limit — это верхняя граница для параметра цикла for.
Информация для пользователей Паскаля: В PRIME3PA мы добавили целочисленную переменную Limit и положили ее равной корню квадратному из n перед началом выполнения цикла for. Переменная Limit — это верхняя граница для параметра цикла for.
При помощи локального меню окна Module (Модуль), пометьте «области» на каждой строке программы. Во время данного сеанса профилирования (для того, чтобы запустить программу выберите Run| Run (Выполнение| Выполнение) или нажмите клавишу F9), программа работает немного быстрее. Общее время выполнения программы PRIME3 сократилось почти на 50 %.
Теперь в качестве основного потребителя времени выполнения выступает функция printf. За счет сокращения числа обращений к подпрограмме вычисления квадратного корня (с 5456 до 999) мы значительно уменьшили общее время выполнения программы.
Добавим еще немного эффективности.
У нас осталось еще несколько возможностей для увеличения эффективности подпрограммы prime. Загрузите PRIME4 в окно Module (Модуль), затем просмотрите строки исходного текста с 8 по 17.
Информация для пользователей Паскаля: загрузите PRIME4PA и изучите строки с 11 по 32.
/* Copyright (c) 1990, Borland International */
#include
prime(int n)
{
int i;
if (n % 2 == 0)
return (n==2);
if (n % 3 == 0)
return (n==3);
if (n % 5 == 0)
return (n==5);
for (i=7; i*i <= n; i+=2)
if (n % i == 0)
return 0;
return 1;
}
main()
{
int i, n;
n = 1000;
for (i=2; i<=n; i++)
if (prime(i))
printf(«%d\n», i);
}
{ Copyright (c) 1990, Borland International }
program Prime4PA;
Var
I,N: Integer;
Function Prime(N: Integer):Boolean;
Var
I: integer;
Begin
If (N MOD 2 = 0) then
Begin
Prime:= N = 2;
Exit;
End;
If (N MOD 3 = 0) then
Begin
Prime:= N = 3;
Exit;
End;
If (N MOD 5 = 0) then
Begin
Prime:= N = 5;
Exit;
End;
For I:= 7 to N-1 do
If (N MOD I = 0) then
Begin
Prime:= False;
Exit;
End;
Prime:= True;
End;
Begin
N:= 1000;
For I:= 2 to N do
If Prime(I) then
Writeln(I);
End.
В этих строках содержится ряд улучшений.
* Три оператора if в подпрограмме prime удаляют из рассмотрения числа, кратные 2, 3, и 5 соответственно. Если на основании этих проверок Вам не удается отсеять рассматриваемое число n, то приходится проверять его делимость на оставшиеся целые числа вплоть до корня квадратного из n. Начать эти проверки можно с числа 7, так как наличие операторов if исключает из рассмотрения все меньшие числа.
* Цикл for теперь работает с шагом 2, так как нет смысла рассматривать четные числа.
* Проверка i*i<=n заменила более дорогой, с точки зрения временных затрат, тест, основывающийся на вычислении квадратного корня.
Результатом всех этих изменений явилось то, что общее время выполнения уменьшилось более чем на одну секунду. Данные, приведенные на рисунке 1.7 показывают, что функция printf отнимает теперь 96 % всего времени выполнения.
Рис. 1.7 Временная и количественная статистика, PRIME4.
Сокращение времени ввода/вывода.
Изменение в доле времени, потребляемой оператором printf, говорит о том, что теперь быстродействие программы в большей степени ограничивается операторами ввода/вывода, чем ее вычислительной частью. Возможно, такое положение является вполне приемлемым. Но, хотя бы просто ради интереса, давайте попробуем выжать еще что-нибудь из этих операторов.
Загрузите PRIME5 в окно Module (Модуль) и посмотрите на 28 строку (строку 3 в Паскалевском варианте).
В Turbo C имеется более быстрый вариант функции printf, называемый cprintf, использование которого является единственным отличием программы PRIME5 от PRIME4. Функция cprintf обрабатывает ситуацию перехода на новую строку иначе, чем printf: в cprintf вместо единственного символа «новая строка» используется пара символов «возврат каретки»/«перевод строки» (\r \n).
Информация для пользователей Паскаля: система Turbo Paskal также содержит быстрый вариант Writeln (содержащийся в модуле Crt). Мы даем указание об использовании этой быстрой версии посредством включения оператора uses Crt в начало нашей программы. В этом заключено единственное отличие PRIME5PA от предыдущего варианта.
Вызовите локальное меню окна Module (Модуль) и установите «области» для каждой строки исходного текста PRIME5. Запустите PRIME5, после чего изучите количественные данные профилирования для строки 28 в PRIME5 (или строки 3 в PRIME5PA).
Более быстрый вариант функции вывода на каждых 168 вызовах экономит почти одну секунду.
Удаление пар символов cr/lf («возврат каретки»/«перевод строки») (PRIME6).
И, наконец, одно последнее изменение. Вместо того, чтобы выводить пару символов «возврат каретки»/«перевод строки» после каждого обнаруженного простого числа, попробуйте выводить просто символ «пробел». В этом и заключается единственное изменение, сделанное в программе PRIME6.
Загрузите PRIME6 (пользователям Паскаля необходимо загрузить PRIME6PA) и установите маркеры «области» на каждой строке, затем выполните эту программу.
О чудо! Удаление пар символов «возврат каретки»/«перевод строки» сократило время выполнения почти в 7 раз. Теперь стал очевиден тот факт, что переход на новую строку это дорогостоящая операция. В результате всех внесенных изменений времена выполнения и количества вызовов распределились довольно-таки равномерно.
Читать дальшеИнтервал:
Закладка: