- •1. Формулировка задания
- •2. Профилирование программ «Test_cyc.Cpp» и «Test_sub.Cpp»
- •3. Профилирование полного времени выполнения программ «Main_p» и «Main_c»
- •4. Детальное профилирование программ «Main_p» и «Main_c»
- •4.1. Профилирование программы «Main_c»
- •4.2. Профилирование программы «Main_p»
- •2005 Год
1. Формулировка задания
Ознакомиться с документацией на SAMPLER и выполнить под его
управлением тестовые программы test_cyc.cppи test_sub.cppс анализом параметров повторения циклов и проверкой их влияния на точность и чувствительность профилирования;
Скомпилировать и выполнить под управлением SAMPLER'а программы на Паскале и С++, разработанные в 1-ой лабораторной работе. Выполнить разбиение программы на функциональные участки и снять профили для двух режимов: 1 - измерение только полного времени выполнения программы; 2 - измерение времен выполнения функциональных участков;
Выявить "узкие места", ввести в программы усовершенствования и получить новые профили. Сравнить результаты, полученные для Паскаля и С, с аналогичными результатами, полученными с помощью программы «Turboprofiler».
2. Профилирование программ «Test_cyc.Cpp» и «Test_sub.Cpp»
Для профилирования программы «Test_cyc.cpp» необходимо внести некоторые изменения в её текст. Эти изменения связаны с расстановкой макросов-меток, ограничивающих зоны профилирования программы «SAMPLER». Текст программы после добавления меток выглядит следующим образом:
// Test_Cyc rebuilded in order to find out how does the Sampler works...
#include "Sampler.h"
#define Size 10000
int i, tmp, dim[Size];
void main()
{
//--------------------------------- One cycle - one line
SAMPLE;
for(i=0;i<Size/10;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };
SAMPLE;
for(i=0;i<Size/5;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };
SAMPLE;
for(i=0;i<Size/2;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };
SAMPLE;
for(i=0;i<Size;i++) { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };
//--------------------------------- One cycle - two lines
SAMPLE;
for(i=0;i<Size/10;i++)
{ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };
SAMPLE;
for(i=0;i<Size/5;i++)
{ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };
SAMPLE;
for(i=0;i<Size/2;i++)
{ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };
SAMPLE;
for(i=0;i<Size;i++)
{ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };
//-------------------------------- One cycle - five lines
SAMPLE;
for(i=0;i<Size/10;i++)
{ tmp=dim[0];
dim[0]=dim[i];
dim[i]=tmp;
};
SAMPLE;
for(i=0;i<Size/5;i++)
{ tmp=dim[0];
dim[0]=dim[i];
dim[i]=tmp;
};
SAMPLE;
for(i=0;i<Size/2;i++)
{ tmp=dim[0];
dim[0]=dim[i];
dim[i]=tmp;
};
SAMPLE;
for(i=0;i<Size;i++)
{ tmp=dim[0];
dim[0]=dim[i];
dim[i]=tmp;
};
SAMPLE;
}
Таким образом, программа «SAMPLER» измерит общее и среднее время выполнения каждого цикла. Результаты профилирования приведены ниже:
----------------------------------------------------------------------
Метки Общее время Кол-во прох. Ср. время
----------------------------------------------------------------------
1 : 11 1 : 13 6.70 1 6.70
----------------------------------------------------------------------
1 : 13 1 : 15 10.90 1 10.90
----------------------------------------------------------------------
1 : 15 1 : 17 28.50 1 28.50
----------------------------------------------------------------------
1 : 17 1 : 20 55.31 1 55.31
----------------------------------------------------------------------
1 : 20 1 : 23 6.70 1 6.70
----------------------------------------------------------------------
1 : 23 1 : 26 11.73 1 11.73
----------------------------------------------------------------------
1 : 26 1 : 29 28.50 1 28.50
----------------------------------------------------------------------
1 : 29 1 : 33 56.15 1 56.15
----------------------------------------------------------------------
1 : 33 1 : 39 6.70 1 6.70
----------------------------------------------------------------------
1 : 39 1 : 45 11.73 1 11.73
----------------------------------------------------------------------
1 : 45 1 : 51 28.50 1 28.50
----------------------------------------------------------------------
1 : 51 1 : 57 56.15 1 56.15
----------------------------------------------------------------------
Анализируя полученные результаты, можно сделать следующие заключения:
Время выполнения цикла не зависит от способа структурного оформления его в коде программы. Аналогично, способ оформления цикла не влияет на качество его профилирования в программе «Sampler»;
Программа «Sampler» корректно оценивает время выполнения каждого из циклов. Точность этой оценки достаточно высока;
Программа «Sampler» позволяет экспериментально подтвердить тот факт, что время выполнения цикла прямо пропорционально количеству его итераций.
Для профилирования программы «Test_sub.cpp» необходимо внести в неё изменения, аналогичные изменениям, внесённым в программу «Test_cyc.cpp». Текст программы, подвергавшейся профилированию, приведён ниже:
#include "Sampler.h"
const unsigned Size = 1000;
void TestLoop(int nTimes)
{
static int TestDim[Size];
int tmp;
int iLoop;
while (nTimes > 0)
{
nTimes --;
iLoop = Size;
while (iLoop > 0)
{
iLoop -- ;
tmp = TestDim[0];
TestDim[0] = TestDim[nTimes];
TestDim[nTimes] = tmp;
}
}
}
void main()
{
SAMPLE;
TestLoop(Size / 10);
SAMPLE;
TestLoop(Size / 5);
SAMPLE;
TestLoop(Size / 2);
SAMPLE;
TestLoop(Size / 1);
SAMPLE;
}
Такая расстановка меток позволяет оценить время, затрачиваемое на выполнение процедуры TestLoopпри вызове её с различными аргументами. Результаты профилирования приведены ниже:
----------------------------------------------------------------------
Метки Общее время Кол-во прох. Ср. время
----------------------------------------------------------------------
1 : 30 1 : 32 338.59 1 338.59
----------------------------------------------------------------------
1 : 32 1 : 34 729.14 1 729.14
----------------------------------------------------------------------
1 : 34 1 : 36 1866.44 1 1866.44
----------------------------------------------------------------------
1 : 36 1 : 38 58615.63 1 58615.63
----------------------------------------------------------------------
Как и следует ожидать, время выполнения функции прямо пропорционально количеству итераций цикла, выполняемого в пределах её тела. Программа «Sampler» позволила оценить время выполнения каждого из вариантов вызова этой процедуры с точностью до сотых долей миллисекунды.