Министерство образования рф
САНКТ-ПЕТЕРБУРГСКИЙГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ»
Кафедра МОЭВМ
ОТЧЁТ
ПО ЛАБОРАТОРНОЙ РАБОТЕ № 2
ПО ДИСЦИПЛИНЕ :
«Метрология программного обеспечения»
студентка группы № 1305
Куени .Л
Преподаватель :
Кирьянчиков В.А.
Санкт-Петербург
2005 –
1.Формулировка задания
1. Ознакомиться с документацией на TurboProfiler и выполнить для программ prost0.c и prost0_p.pas следующее задание:
компиляция с использованием автономного отладчика;
профилирование по времени;
профилирование по частоте;
профилирование по средним временам на 1 вызов;
запись результатов профилирования в файл для печати;
2. Выполнить тестовые программы test_cyc.c, test_sub.c c анализом параметров повторения циклов и проверкой их влияния на точность и чувствительность профилирования;
3. Скомпилировать и выполнить под управлением TurboProfiler'а программы на Паскале и С, разработанные в 1-ой лабораторной работе. Выполнить разбиение программы на функциональные участки, снять все виды профилей, выявить "узкие места", ввести в программы усовершенствования и получить новые профили. Сравнить результаты, полученные для Паскаля и С. Объяснить смысл введенных модификаций программ.
2. Профилирование программ «prost0_p» и «prost0_c»
Процесс компиляции программ с использованием автономного (standalone) отладчика обеспечивается установкой в настройках компиляторовBorlandPascalиBorlandC++ флажка «usestandalonedebugger» (пункт меню «OptionsDebugger»).
После компиляции соответствующие модули загружаются в программу-профилировщик вместе с текстом исходного кода и выполняются под его управлением. В результате профилировщик выдаёт статистику выполнения программы, определённую по так называемым зонам «areas». Зоны программы определяются пользователем, ими могут являться отдельные строки кода, блоки, процедуры и функции.
Для программы Prost0_cполучена следующая статистика:
Time Counts
#include "stdio.h";
int primes[1000];
#define MAXPRIMES 1000
0.0000 1 void main()
{
int j;
int lastprime, curprime;
0.0000 1 primes[0] = 2;
0.0000 1 primes[1] = 3;
0.0000 1 lastprime = 1;
0.0000 1 curprime = 3;
0.0568 1 printf("prime %d = %d\n", 0, primes[0]);
0.0018 1 printf("prime %d = %d\n", 1, primes[1]);
0.0013 500 while(curprime < MAXPRIMES)
{
0.0023 499 for(j = 0; j <= lastprime; j++)
0.4554 15122 if((curprime % primes[j]) == 0)
{
0.0006 333 curprime += 2;
0.0013 333 break;
}
0.0025 499 if(j <= lastprime)
0.0008 333 continue;
0.0007 166 lastprime++;
0.6429 166 printf("prime %d = %d\n", lastprime, curprime);
0.0554 166 primes[lastprime] = curprime;
0.0009 166 curprime += 2;
}
0.0000 1 }
Дополнительная информация отражается в статистике среднего времени, затрачиваемого на выполнение одной строчки:
Execution Profile
Total time: 1.2249 sec
% of total: 99 %
Run: 1 of 1
Filter: > 0
Show: Time per call
Sort: Frequency
#PROST0_C#16 0.0568 sec/call │==============================================
#PROST0_C#31 0.0038 sec/call │===
#PROST0_C#17 0.0018 sec/call │=
#PROST0_C#32 0.0003 sec/call │
Для программы Prost0_pполучена следующая статистика:
Time Counts
program prost;
const maxprime=1000;
type intarr=array[0..maxprime] of integer;
var primes: intarr;
j,lastprime, curprime: integer;
0.0015 1 begin
0.0000 1 primes[0] := 2;
0.0000 1 primes[1] := 3;
0.0000 1 lastprime := 1;
0.0000 1 curprime := 3;
0.0018 1 writeln('prime0 = ', primes[0]);
0.0017 1 writeln('prime1 = ', primes[1]);
0.0017 499 while(curprime < MAXPRIME) do
begin
0.0024 498 for j := 0 to lastprime do
0.6701 15120 if((curprime mod primes[j]) = 0)
then begin
0.0012 333 curprime := curprime +2;
0.1116 333 break;
0.8944 14787 end;
0.0579 498 if((j+1) <= lastprime) then continue;
0.0564 166 lastprime:= lastprime+1;
0.3638 166 writeln('prime ', lastprime,'=', curprime);
0.0015 166 primes[lastprime] := curprime;
0.0003 166 curprime := curprime +2;
0.0018 166 end
0.0014 1 end.
Дополнительная информация отражается в статистике среднего времени, затрачиваемого на выполнение одной строчки:
Execution Profile
Total time: 2.1703 sec
% of total: 100%
Run: 1 of 1
Filter: >0
Show: Time per call
Sort: Frequency
PROST.27 0.0021 sec/call |**********************************************
PROST.15 0.0018 sec/call |**************************************
PROST.16 0.0017 sec/call |*************************************
PROST.9 0.0015 sec/call |*******************************
PROST.31 0.0014 sec/call |******************************
PROST.26 0.0003 sec/call |*******
PROST.23 0.0003 sec/call |*******
PROST.25 0.0001 sec/call |**
PROST.24 0.0000 sec/call |*
Сравнивая результаты, полученные при профилировании программ на Паскале и Си++, можно выявить следующие закономерности:
Общее время выполнения программы на Паскале превосходит время выполнения программы на Си.
Операции вывода на экран информации реализованы в Паскале несколько более эффективным образо м.
Оптимизация: Избавиться от вывода на экран или уменьшить количество выводимых символов на экран.