2.3.1 Профилирование программы c1.С
Turbo Profiler Version 2.1 Wed Mar 28 23:18:27 2007
Program: C:\ЛЭТИ\SEM_8\МЕТРОЛ~1\LABS\MY\LAB2_1\PART3_~1\C\C1.EXE
Time Counts
#include <stdlib.h>
#define size 20
0.0001 100 void linfit1(double x[size],double y[size], double* y_calc, double* a, double* b,int n
{
int i;
double sum_x,sum_y,sum_xy,sum_x2,sum_y2,xi,yi,sxy,sxx,syy;
0.0001 100 sum_x = 0;
0.0001 100 sum_y = 0;
0.0001 100 sum_xy = 0;
0.0001 100 sum_x2 = 0;
0.0001 100 sum_y2 = 0;
0.0001 100 for (i=0; i<n; i++)
{
0.0015 10000 xi=x[i];
0.0562 10000 yi=y[i];
0.0016 10000 sum_x += xi;
0.0566 10000 sum_y += yi;
0.0136 10000 sum_xy += xi*yi;
0.0570 10000 sum_x2 += xi*xi;
0.0567 10000 sum_y2 += yi*yi;
}
0.0001 100 sxx = sum_x2-sum_x*sum_x/n;
0.0001 100 sxy = sum_xy-sum_x*sum_y/n;
0.0003 100 syy = sum_y2-sum_y*sum_y/n;
0.0001 100 *b=sxy/sxx;
0.0001 100 *a=((sum_x2*sum_y-sum_x*sum_xy)/n)/sxx;
0.0001 100 for (i=0;i<n;i++)
0.0566 10000 *(y_calc+i) = *a + *b * x[i];
0.0001 100 }
0.0000 1 void main(void)
{
int i,k;
double a,b,x[size],y[size],y_calc[size];
0.0000 1 for(k=0; k<100; k++)
{
0.0656 100 randomize();
0.0000 100 for (i=0;i<size;i++)
{
0.0563 10000 x[i] = 10+i*10;
0.1113 10000 y[i] = 10+i*10 + random(20) - 10;
}
0.0001 100 linfit1(x,y,&y_calc[0],&a,&b,size);
}
0.0000 1 }
Профилирование по времени и частоте
Turbo Profiler Version 2.1 Wed Mar 28 23:19:56 2007
Program: C:\ЛЭТИ\SEM_8\МЕТРОЛ~1\LABS\MY\LAB2_1\PART3_~1\C\C1.EXE
Execution Profile
Total time: 0.4904 sec
% of total: 99 %
Run: 1 of 1
Filter: All
Show: Time and counts
Sort: Frequency Pass count: +++ Time: ***
#LINEFIT1#41 10000 7% │++++++++++++
0.1113 sec 25% │*************
#LINEFIT1#36 100 <1% │
0.0656 sec 11% │*******
#LINEFIT1#19 10000 7% │++++++++++++
0.0570 sec 10% │******
#LINEFIT1#20 10000 7% │++++++++++++
0.0567 sec 10% │******
#LINEFIT1#17 10000 7% │++++++++++++
0.0566 sec 10% │******
#LINEFIT1#28 10000 7% │++++++++++++
0.0566 sec 10% │******
#LINEFIT1#40 10000 7% │++++++++++++
0.0563 sec 10% │******
#LINEFIT1#15 10000 7% │++++++++++++
0.0562 sec 10% │******
#LINEFIT1#18 10000 7% │++++++++++++
0.0136 sec 2% │*
#LINEFIT1#45 100 <1% │
0.0084 sec <1% │*
#LINEFIT1#37 100 <1% │
0.0079 sec <1% │
#LINEFIT1#16 10000 7% │++++++++++++
0.0016 sec <1% │
#LINEFIT1#14 10000 7% │++++++++++++
0.0015 sec <1% │
#LINEFIT1#24 100 <1% │
0.0002 sec <1% │
#LINEFIT1#44 100 <1% │
0.0001 sec <1% │
_linfit1 100 <1% │
0.0001 sec <1% │
#LINEFIT1#7 100 <1% │
0.0001 sec <1% │
#LINEFIT1#27 100 <1% │
0.0001 sec <1% │
#LINEFIT1#25 100 <1% │
0.0001 sec <1% │
#LINEFIT1#38 100 <1% │
0.0001 sec <1% │
#LINEFIT1#26 100 <1% │
0.0001 sec <1% │
#LINEFIT1#29 100 <1% │
0.0001 sec <1% │
#LINEFIT1#46 100 <1% │
0.0001 sec <1% │
#LINEFIT1#23 100 <1% │
Turbo Profiler Version 2.1 Wed Mar 28 23:19:56 2007
0.0001 sec <1% │
#LINEFIT1#8 100 <1% │
0.0001 sec <1% │
#LINEFIT1#22 100 <1% │
0.0001 sec <1% │
#LINEFIT1#12 100 <1% │
0.0001 sec <1% │
#LINEFIT1#10 100 <1% │
0.0001 sec <1% │
#LINEFIT1#11 100 <1% │
0.0001 sec <1% │
#LINEFIT1#9 100 <1% │
0.0000 sec <1% │
_main 1 <1% │
0.0000 sec <1% │
#LINEFIT1#34 1 <1% │
0.0000 sec <1% │
#LINEFIT1#49 1 <1% │
0.0000 sec <1% │
Вывод: Попробуем оптимизировать программу за счет переноса тела функции «Linefit1» в тело «main».
Оптимизированная программа С2.С:
Turbo Profiler Version 2.1 Wed Mar 28 23:22:52 2007
Program: C:\ЛЭТИ\SEM_8\МЕТРОЛ~1\LABS\MY\LAB2_1\PART3_~1\C\C2.EXE
Time Counts
#include <stdlib.h>
#define size 20
0.0000 1 void main(void)
{
int i,k;
double a,b,x[size],y[size],y_calc[size];
double sum_x,sum_y,sum_xy,sum_x2,sum_y2,xi,yi,sxy,sxx,syy;
0.0000 1 for (k=0;k<100;k++)
{
0.0758 100 randomize();
0.0549 100 for (i=0;i<size;i++)
{
0.1113 10000 x[i] = 10+i*10;
0.0564 10000 y[i] = 10+i*10 + random(20) - 10;
}
0.0000 100 for (i=0; i<size; i++)
{
0.0567 10000 xi=x[i];
0.1112 10000 yi=y[i];
0.0568 10000 sum_x += xi;
0.0562 10000 sum_y += yi;
0.1663 10000 sum_xy += xi*yi;
0.0563 10000 sum_x2 += xi*xi;
0.0566 10000 sum_y2 += yi*yi;
}
0.0000 100 sxx = sum_x2-sum_x*sum_x/size;
0.0550 100 sxy = sum_xy-sum_x*sum_y/size;
0.0000 100 syy = sum_y2-sum_y*sum_y/size;
0.0001 100 b=sxy/sxx;
0.0000 100 a=((sum_x2*sum_y-sum_x*sum_xy)/size)/sxx;
0.0000 100 for (i=0;i<size;i++)
0.0013 10000 y_calc[i] = a + b * x[i];
}
0.0000 1 }
Профилирование по времени и частоте
Turbo Profiler Version 2.1 Wed Mar 28 23:23:15 2007
Program: C:\ЛЭТИ\SEM_8\МЕТРОЛ~1\LABS\MY\LAB2_1\PART3_~1\C\C2.EXE
Execution Profile
Total time: 0.2649 sec
% of total: 99 %
Run: 1 of 1
Filter: All
Show: Time and counts
Sort: Frequency Pass count: +++ Time: ***
#LINEFIT0#16 10000 8% │++++++++++++++++++++
0.1113 sec 23% │**********************
#LINEFIT0#23 10000 8% │++++++++++++++++++++
0.1112 sec 23% │**********************
#LINEFIT0#12 100 <1% │+
0.0758 sec 6% │***************
#LINEFIT0#24 10000 8% │++++++++++++++++++++
0.0568 sec 4% │***********
#LINEFIT0#22 10000 8% │++++++++++++++++++++
0.0567 sec 4% │***********
#LINEFIT0#28 10000 8% │++++++++++++++++++++
0.0566 sec 4% │***********
#LINEFIT0#17 10000 8% │++++++++++++++++++++
0.0564 sec 4% │***********
#LINEFIT0#27 10000 8% │++++++++++++++++++++
0.0563 sec 4% │***********
#LINEFIT0#25 10000 8% │++++++++++++++++++++
0.0562 sec 4% │***********
#LINEFIT0#31 100 <1% │+
0.0550 sec 4% │***********
#LINEFIT0#14 100 <1% │+
0.0549 sec 4% │***********
#LINEFIT0#38 100 <1% │+
0.0087 sec <1% │*
#LINEFIT0#13 100 <1% │+
0.0080 sec <1% │|*
#LINEFIT0#36 10000 8% │++++++++++++++++++++
0.0013 sec <1% │
#LINEFIT0#33 100 <1% │+
0.0001 sec <1% │
#LINEFIT0#20 100 <1% │+
0.0000 sec <1% │
#LINEFIT0#32 100 <1% │+
0.0000 sec <1% │
#LINEFIT0#35 100 <1% │+
0.0000 sec <1% │
#LINEFIT0#34 100 <1% │+
0.0000 sec <1% │
#LINEFIT0#30 100 <1% │+
0.0000 sec <1% │
#LINEFIT0#39 100 <1% │+
0.0000 sec <1% │
#LINEFIT0#10 1 <1% │
0.0000 sec <1% │
_main 1 <1% │
0.0000 sec <1% │
#LINEFIT0#42 1 <1% │
Turbo Profiler Version 2.1 Wed Mar 28 23:23:15 2007
0.0000 sec <1% │
Вывод: Время работы программы уменьшилось с 0.4904 секунды до 0.2649 секунды (выигрыш по времени составил примерно 50 %).