- •Задание
- •Ознакомиться с документацией на TurboProfiler и выполнить для программ prost0.C и prost0_p.Pas следующее задание:
- •Реализация
- •На Паскале
- •Профилирование программы Prost0 test_cyc.Cpp
- •Профилирование программы Prost0 test_sub.Cpp
- •Оптимизированная программа
- •На Паскале
- •Оптимизированная программа
Профилирование программы Prost0 test_cyc.Cpp
Turbo Profiler Version 2.1 Sat Apr 16 21:58:06 2005
Program: D:\ETU\8‘…Њ…‘~1\Њ…’ђЋ‹~1\LAB2\2_TEST~1\TEST_CYC.EXE File TEST_CYC.CPP
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.0001 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.0569 1000 { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };
0.0000 1 for(i=0;i<Size/5;i++)
0.0732 2000 { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };
0.0000 1 for(i=0;i<Size/2;i++)
0.1220 5000 { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };
0.0000 1 for(i=0;i<Size;i++)
0.3466 10000 { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };
0.0000 1 for(i=0;i<Size/10;i++)
0.0010 1000 { tmp=dim[0];
0.0029 1000 dim[0]=dim[i];
0.0010 1000 dim[i]=tmp;
};
0.0000 1 for(i=0;i<Size/5;i++)
0.1683 2000 { tmp=dim[0];
0.0599 2000 dim[0]=dim[i];
0.0040 2000 dim[i]=tmp;
};
0.0000 1 for(i=0;i<Size/2;i++)
0.3385 5000 { tmp=dim[0];
0.1713 5000 dim[0]=dim[i];
0.1710 5000 dim[i]=tmp;
};
0.0000 1 for(i=0;i<Size;i++)
0.1767 10000 { tmp=dim[0];
0.3415 10000 dim[0]=dim[i];
0.1211 10000 dim[i]=tmp;
};
0.0000 1 }
Вывод: Структура операторов цикла влияет на качество профилирования. Чем больше строк, тем хуже время профилирования.
Профилирование программы Prost0 test_sub.Cpp
Turbo Profiler Version 2.1 Sat Apr 16 15:57:42 2005
Program: D:\ETU\8‘…Њ…‘~1\Њ…’ђЋ‹~1\LAB2\TEST\TEST_SUB.EXE File TEST_SUB.CPP
Time Counts
const unsigned Size = 1000;
0.0000 4 void TestLoop(int nTimes)
{
static int TestDim[Size];
int tmp;
int iLoop;
0.0009 909 while (nTimes > 0)
{
0.0035 906 nTimes --;
0.0016 906 iLoop = Size;
32.517 906332 while (iLoop > 0)
{
31.093 905427 iLoop -- ;
27.610 905427 tmp = TestDim[0];
33.148 905426 TestDim[0] = TestDim[nTimes];
29.234 905426 TestDim[nTimes] = tmp;
}
}
0.0000 3 } /* TestLoop */
0.0000 1 void main()
{
0.0000 1 TestLoop(Size / 10); // 100 * 1000 Ї®ўв®аҐЁ©
0.0000 1 TestLoop(Size / 5); // 200 * 1000 Ї®ўв®аҐЁ©
0.0000 1 TestLoop(Size / 2); // 500 * 1000 Ї®ўв®аҐЁ©
0.0000 1 TestLoop(Size / 1); // 1000* 1000 Ї®ўв®аҐЁ©
0 0 }
Вывод: Процедуры и функции плохо влияет на качество профилирования.
Профилирование программы интегрирования методом Симпсона
Для того чтобы время профилирования участков программы было не слишком мало, я ввел зацикливание. При первом профилировании оператор ввода с клавиатуры потреблял огромное количество времени, поэтому нижеприведенный код программы лишен этого оператора, что значительно улучшило характеристики программы.
На С++
Turbo Profiler Version 2.1 Sat Apr 16 22:40:47 2005
Program: D:\ETU\8‘…Њ…‘~1\Њ…’ђЋ‹~1\LAB2\3_PART~1\LABMET.EXE File LABMET.CPP
Time Counts
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
const double tol = 1.0E-4;
double sum, upper, lower, erf, twopi;
double fx(double x)
{
0.0006 500 return exp(-x * x);
0.0006 500 }
double simps(double lower,double upper,double tol)
{
int i;
double x,delta_x,even_sum,odd_sum,end_sum, sum1;
int pieces;
double sum;
0.0001 100 pieces = 2;
0.0000 100 delta_x = (upper - lower) / pieces;
0.0549 100 odd_sum = fx(lower + delta_x);
0.0000 100 even_sum = 0.0;
0.0001 100 end_sum = fx(lower) + fx(upper);
0.0001 100 sum = (end_sum + 4.0 * odd_sum) * delta_x / 3.0;
0.0058 100 printf("%d", pieces);
0.0062 100 printf("%f", sum);
do
{
0.0000 100 pieces = pieces * 2;
0.0000 100 sum1 = sum;
0.0001 100 delta_x = (upper - lower) / pieces;
0.0553 100 even_sum = even_sum + odd_sum;
0.0001 100 odd_sum = 0.0;
0.0001 100 for (i = 1; i <= (pieces / 2); i++)
{
0.0002 200 x = lower + delta_x * (2.0 * i - 1.0);
0.0002 200 odd_sum = odd_sum + fx(x);
}
0.0000 100 sum = (end_sum + 4.0 * odd_sum + 2.0 * even_sum) *
}
0.0014 100 while (abs(sum - sum1) > abs(tol * sum1));
0.0001 100 return sum;
0.0000 100 }
void main ()
{
double res;
int j;
0.0000 1 double pi = 3.14159265359;
0.0000 1 for (j = 1; j <= 100; j++)
{
0.0000 100 twopi = 2.0 / sqrt(pi);
0.0001 100 lower = 0.0;
//cin >> upper;
0.0001 100 upper = 1;
Turbo Profiler Version 2.1 Sat Apr 16 22:40:47 2005
0.0001 100 if (upper >= 0.0)
{
0.0000 100 res = simps(lower,upper,tol);
0.0001 100 erf = twopi * res;
0.0630 100 printf("%f", upper);
0.0063 100 printf("%f", erf);
}
}
0.0008 1 }
Профилирование по времени.
Turbo Profiler Version 2.1 Sat Apr 16 22:39:50 2005
Program: D:\ETU\8‘…Њ…‘~1\Њ…’ђЋ‹~1\LAB2\3_PART~1\LABMET.EXE
Execution Profile
Total time: 0.1977 sec
% of total: 99 %
Run: 1 of 1
Filter: All
Show: Time
Sort: Frequency
#LABMET#64 0.0630 sec 31% |**********************************************
#LABMET#34 0.0553 sec 27% |****************************************
#LABMET#23 0.0549 sec 27% |****************************************
#LABMET#65 0.0063 sec 3% |****
#LABMET#28 0.0062 sec 3% |****
#LABMET#27 0.0058 sec 2% |****
#LABMET#43 0.0014 sec <1% |*
#LABMET#69 0.0008 sec <1% |
#LABMET#11 0.0006 sec <1% |
#LABMET#12 0.0006 sec <1% |
#LABMET#38 0.0002 sec <1% |
#LABMET#39 0.0002 sec <1% |
#LABMET#58 0.0001 sec <1% |
#LABMET#44 0.0001 sec <1% |
#LABMET#60 0.0001 sec <1% |
#LABMET#26 0.0001 sec <1% |
#LABMET#36 0.0001 sec <1% |
#LABMET#63 0.0001 sec <1% |
#LABMET#21 0.0001 sec <1% |
#LABMET#35 0.0001 sec <1% |
#LABMET#25 0.0001 sec <1% |
#LABMET#56 0.0001 sec <1% |
#LABMET#33 0.0001 sec <1% |
#LABMET#45 0.0000 sec <1% |
#LABMET#32 0.0000 sec <1% |
#LABMET#31 0.0000 sec <1% |
#LABMET#41 0.0000 sec <1% |
#LABMET#62 0.0000 sec <1% |
#LABMET#24 0.0000 sec <1% |
#LABMET#55 0.0000 sec <1% |
#LABMET#22 0.0000 sec <1% |
#LABMET#51 0.0000 sec <1% |
#LABMET#53 0.0000 sec <1% |
Профилирование по частоте
Turbo Profiler Version 2.1 Sat Apr 16 22:41:47 2005
Program: D:\ETU\8‘…Њ…‘~1\Њ…’ђЋ‹~1\LAB2\3_PART~1\LABMET.EXE
Execution Profile
Total time: 0.1977 sec
% of total: 99 %
Run: 1 of 1
Filter: All
Show: Counts
Sort: Frequency
#LABMET#12 500 12% |++++++++++++++++++++++++++++++++++++++++++++++
#LABMET#11 500 12% |++++++++++++++++++++++++++++++++++++++++++++++
#LABMET#38 200 4% |++++++++++++++++++
#LABMET#39 200 4% |++++++++++++++++++
#LABMET#22 100 2% |+++++++++
#LABMET#24 100 2% |+++++++++
#LABMET#25 100 2% |+++++++++
#LABMET#26 100 2% |+++++++++
#LABMET#27 100 2% |+++++++++
#LABMET#28 100 2% |+++++++++
#LABMET#31 100 2% |+++++++++
#LABMET#64 100 2% |+++++++++
#LABMET#33 100 2% |+++++++++
#LABMET#34 100 2% |+++++++++
#LABMET#35 100 2% |+++++++++
#LABMET#36 100 2% |+++++++++
#LABMET#21 100 2% |+++++++++
#LABMET#23 100 2% |+++++++++
#LABMET#41 100 2% |+++++++++
#LABMET#43 100 2% |+++++++++
#LABMET#44 100 2% |+++++++++
#LABMET#45 100 2% |+++++++++
#LABMET#32 100 2% |+++++++++
#LABMET#65 100 2% |+++++++++
#LABMET#55 100 2% |+++++++++
#LABMET#56 100 2% |+++++++++
#LABMET#58 100 2% |+++++++++
#LABMET#62 100 2% |+++++++++
#LABMET#60 100 2% |+++++++++
#LABMET#63 100 2% |+++++++++
#LABMET#53 1 <1% |
#LABMET#51 1 <1% |
#LABMET#69 1 <1% |
Профилирование по средним временам на 1 вызов:
Turbo Profiler Version 2.1 Sat Apr 16 22:42:34 2005
Program: D:\ETU\8‘…Њ…‘~1\Њ…’ђЋ‹~1\LAB2\3_PART~1\LABMET.EXE
Execution Profile
Total time: 0.1977 sec
% of total: 99 %
Run: 1 of 1
Filter: All
Show: Time per call
Sort: Frequency
#LABMET#69 0.0008 sec/call |**********************************************
#LABMET#64 0.0006 sec/call |*********************************
#LABMET#34 0.0005 sec/call |*****************************
#LABMET#23 0.0005 sec/call |*****************************
#LABMET#65 0.0000 sec/call |***
#LABMET#28 0.0000 sec/call |***
#LABMET#27 0.0000 sec/call |***
#LABMET#43 0.0000 sec/call |
#LABMET#51 0.0000 sec/call |
#LABMET#11 0.0000 sec/call |
#LABMET#31 0.0000 sec/call |
#LABMET#32 0.0000 sec/call |
#LABMET#33 0.0000 sec/call |
#LABMET#26 0.0000 sec/call |
#LABMET#35 0.0000 sec/call |
#LABMET#36 0.0000 sec/call |
#LABMET#25 0.0000 sec/call |
#LABMET#39 0.0000 sec/call |
#LABMET#41 0.0000 sec/call |
#LABMET#24 0.0000 sec/call |
#LABMET#44 0.0000 sec/call |
#LABMET#45 0.0000 sec/call |
#LABMET#22 0.0000 sec/call |
#LABMET#53 0.0000 sec/call |
#LABMET#55 0.0000 sec/call |
#LABMET#56 0.0000 sec/call |
#LABMET#58 0.0000 sec/call |
#LABMET#60 0.0000 sec/call |
#LABMET#62 0.0000 sec/call |
#LABMET#63 0.0000 sec/call |
#LABMET#12 0.0000 sec/call |
#LABMET#21 0.0000 sec/call |
#LABMET#38 0.0000 sec/call |
Вывод: Основное время тратится на вывод символов на экран (printf). Попробуем оптимизировать программу за счет удаления вывода printf.