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

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 }

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