Скачиваний:
16
Добавлен:
01.05.2014
Размер:
82 Кб
Скачать
☆

3. Профилирование программ «test_cyc» и «test_sub»

Программа «test_cyc» показала при профилировании следующие результаты:

Time Counts

#define Size 10000

int i, tmp, dim[Size];

0.0000 1 Void main()

{

0.0000 1 for(i=0;i<Size/10;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp

0.0000 1 for(i=0;i<Size/5;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp;

0.0000 1 for(i=0;i<Size/2;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp;

0.0000 1 for(i=0;i<Size;i++) { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp;

0.0000 1 for(i=0;i<Size/10;i++)

0.0053 1000 { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };

0.0000 1 for(i=0;i<Size/5;i++)

0.0634 2000 { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };

0.0000 1 for(i=0;i<Size/2;i++)

0.0775 5000 { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };

0.0000 1 for(i=0;i<Size;i++)

0.4288 10000 { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };

0.0000 1 for(i=0;i<Size/10;i++)

0.0051 1000 { tmp=dim[0];

0.1148 1000 dim[0]=dim[i];

0.0054 1000 dim[i]=tmp;

};

0.0000 1 for(i=0;i<Size/5;i++)

0.0640 2000 { tmp=dim[0];

0.0086 2000 dim[0]=dim[i];

0.0084 2000 dim[i]=tmp;

};

0.0000 1 for(i=0;i<Size/2;i++)

0.4086 5000 { tmp=dim[0];

0.0726 5000 dim[0]=dim[i];

0.4607 5000 dim[i]=tmp;

};

0.0000 1 for(i=0;i<Size;i++)

0.4822 10000 { tmp=dim[0];

0.3185 10000 dim[0]=dim[i];

0.5402 10000 dim[i]=tmp;

};

0.0000 1 }

Анализируя полученные результаты, можно заметить следующие закономерности:

точность профилирования существенно зависит от того, как структурно организован цикл в коде программы. В случае, когда тело цикла расположено компактно в одной строке с заголовком, накладные расходы на обработку строки, вносимые профилировщиком, не сказываются на точности оценок. В случае, когда операторы тела цикла записаны каждый на своей строке, накладные расходы, вносимые профилировщиком, накапливаются и, в итоге, негативно сказываются на точности профилирования, завышая оценки времени выполнения.

Программа «test_sub» показала при профилировании следующие результаты:

Time Counts

const unsigned Size = 1000;

0.0000 4 void TestLoop(int nTimes)

{

static int TestDim[Size];

int tmp;

int iLoop;

0.0570 882 while (nTimes > 0)

{

0.0020 879 nTimes --;

0.0570 879 iLoop = Size;

39.211 879797 while (iLoop > 0)

{

42.213 878918 iLoop -- ;

39.204 878918 tmp = TestDim[0];

39.137 878918 TestDim[0] = TestDim[nTimes];

42.591 878918 TestDim[nTimes] = tmp;

}

}

0.0000 3 } /* TestLoop */

0.0000 1 Void main()

{

0.0000 1 TestLoop(Size / 10);

0.0000 1 TestLoop(Size / 5);

0.0000 1 TestLoop(Size / 2);

0.0000 1 TestLoop(Size / 1);

0 0 }

Использование процедуры приводит к тому, что количество вызовов, приходящихся на каждую из строк её кода, весьма велико. Процесс выполнения программы под управлением профилировщика занимает много времени и приводит к тому, что результаты такого профилирования крайне неточны. К сожалению, вычислительная мощность машины, на которой выполнялось профилирование, не позволила дождаться завершения процесса, поэтому приведённые результаты нельзя считать полностью достоверными.

4. Обработка собственной программы

Программа LABCPP .CPP

Для получения корректных результатов профилирования необходимо исключить влияние процедур ввода параметров от пользователя. Таким образом, в качестве «зон» профилирования были выбраны строчки вычислительных процедур.

Исходная программа на Паскале показала следующие результаты:

Time Counts

uses Crt;

const max = 20;

cyc_count = 20;

type index = 1..max;

ary = array[index] of real;

var x,y : ary;

n : integer;

seed: real;

{-------------------}

sumx,sumy: real;

sumxy, sumx2: real;

k: integer;

resa,resb: real;

cycle: integer;

function random(dummy: integer): real;

const pi = 3.14159;

var x : real; i : integer;

Соседние файлы в папке Лабораторная работа №23