Лабы по МПО / labO3 / l3
.docПрофилирование программы На С++
(измерение времени полного выполнения программы)
#include <Math.h>
#include <IOStream.h>
#include <Conio.h>
#include "Sampler.h"
const pi = 3.14159;
const max = 20;
const cyc_count = 20;
float seed;
float random(float dummy) {
float x; int i;
x = seed + pi;
x = exp(5.0 * log(x));
seed = x - int(x);
return seed;
}
void get_data(float *x, float *y, int &n) {
const a = 5.0;
const b = 2.0;
int i,j;
float fudge = 0.5;
n = 10;
for (i=1; i<=n; i++) {
j = n + 1 - i;
x[i] = j;
y[i] = (a*j + b) * (1.0 + (2.0 * random(0) - 1.0) * fudge);
}
}
void write_data(float *x, float *y, int n) {
int i;
for (i = 1; i <= n; i++)
cout << "X[" << i << "]=" << x[i] << "\t\tY[" << i << "]=" << y[i] << "\n";
}
void main() {
SAMPLE; //49
float x[max];
float y[max];
int n;
float sumx,sumy;
float sumxy, sumx2;
int k;
float resa,resb;
int cycle;
for(cycle = 0; cycle < cyc_count; cycle++) {
// SAMPLE; //59
clrscr();
// SAMPLE; //61
seed = 4.0;
// SAMPLE;
get_data(x,y,n);
// SAMPLE; //65
write_data(x,y,n);
// SAMPLE; //67
//----------------------------------------- Calculative part starts
// Accumulating statistics
sumx = 0; sumy = 0; sumxy = 0; sumx2 = 0;
for (k=1; k<=n; k++) {
sumx += x[k];
sumy += y[k];
sumxy += x[k] * y[k];
sumx2 += x[k] * x[k];
}
// Recieving verdict
resa = (sumxy - sumx*sumy/n) / (sumx2 - sumx*sumx/n);
resb = (sumy - resa * sumx) / n;
// SAMPLE;//80
cout << "Approximated with y=ax+b where a = " << resa << ", b=" << resb;
//------------------------------------------- Calculative part ends
// SAMPLE; //83
}
SAMPLE; //86
}
Список обработанных файлов.
----------------------------------------------------------------------
NN Имя обработанного файла
----------------------------------------------------------------------
1. MAIN.CPP
----------------------------------------------------------------------
Таблица с результатами измерений ( используется 2 из 416 записей )
----------------------------------------------------------------------
Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)
----------------------------------------------------------------------
1 : 49 1 : 86 117035.15 1 117035.15
----------------------------------------------------------------------
Профилирование программы на С++
(измерение времен выполнения функциональных участков)
#include <Math.h>
#include <IOStream.h>
#include <Conio.h>
#include "Sampler.h"
const pi = 3.14159;
const max = 20;
const cyc_count = 20;
float seed;
float random(float dummy) {
float x; int i;
x = seed + pi;
x = exp(5.0 * log(x));
seed = x - int(x);
return seed;
}
void get_data(float *x, float *y, int &n) {
const a = 5.0;
const b = 2.0;
int i,j;
float fudge = 0.5;
n = 10;
for (i=1; i<=n; i++) {
j = n + 1 - i;
x[i] = j;
y[i] = (a*j + b) * (1.0 + (2.0 * random(0) - 1.0) * fudge);
}
}
void write_data(float *x, float *y, int n) {
int i;
for (i = 1; i <= n; i++)
cout << "X[" << i << "]=" << x[i] << "\t\tY[" << i << "]=" << y[i] << "\n";
}
void main() {
float x[max];
float y[max];
int n;
float sumx,sumy;
float sumxy, sumx2;
int k;
float resa,resb;
int cycle;
for(cycle = 0; cycle < cyc_count; cycle++) {
SAMPLE; //59
clrscr();
SAMPLE; //61
seed = 4.0;
SAMPLE;
get_data(x,y,n);
SAMPLE; //65
write_data(x,y,n);
SAMPLE; //67
//----------------------------------------- Calculative part starts
// Accumulating statistics
sumx = 0; sumy = 0; sumxy = 0; sumx2 = 0;
for (k=1; k<=n; k++) {
sumx += x[k];
sumy += y[k];
sumxy += x[k] * y[k];
sumx2 += x[k] * x[k];
}
// Recieving verdict
resa = (sumxy - sumx*sumy/n) / (sumx2 - sumx*sumx/n);
resb = (sumy - resa * sumx) / n;
SAMPLE;//80
cout << "Approximated with y=ax+b where a = " << resa << ", b=" << resb;
//------------------------------------------- Calculative part ends
SAMPLE; //83
}
}
Список обработанных файлов.
----------------------------------------------------------------------
NN Имя обработанного файла
----------------------------------------------------------------------
1. MAIN.CPP
----------------------------------------------------------------------
Таблица с результатами измерений ( используется 7 из 416 записей )
----------------------------------------------------------------------
Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)
----------------------------------------------------------------------
1 : 59 1 : 61 1427.28 20 71.36
----------------------------------------------------------------------
1 : 61 1 : 63 17.60 20 0.88
----------------------------------------------------------------------
1 : 63 1 : 65 102.25 20 5.11
----------------------------------------------------------------------
1 : 65 1 : 67 96766.32 20 4938.32
----------------------------------------------------------------------
1 : 67 1 : 80 36.88 20 1.84
----------------------------------------------------------------------
1 : 80 1 : 83 6824.62 20 341.23
----------------------------------------------------------------------
1 : 83 1 : 59 19.28 19 1.01
----------------------------------------------------------------------
Профилирование оптимизированной программы на С++
(измерение времени полного выполнения программы)
#include <Math.h>
#include <IOStream.h>
#include <Conio.h>
#include "Sampler.h"
const pi = 3.14159;
const max = 20;
const cyc_count = 20;
float seed;
float random() {
float x; int i;
x = seed + pi;
x = exp(5.0 * log(x));
seed = x - int(x);
return seed;
}
void get_data(float *x, float *y, int &n) {
const a = 5.0;
const b = 2.0;
int i,j;
float fudge = 0.5;
n = 10;
for (i=1; i<=n; i++) {
j = n + 1 - i;
x[i] = j;
y[i] = (a*j + b) * (1.0 + (2.0 * random() - 1.0) * fudge);
}
}
void write_data(float *x, float *y, int n) {
int i;
for (i = 1; i <= n; i++)
cout << "X[" << i << "]=" << x[i] << "\t\tY[" << i << "]=" << y[i] << "\n";
}
void main() {
SAMPLE; //49
float x[max];
float y[max];
int n;
float sumx,sumy;
float sumxy, sumx2;
int k;
float resa,resb;
int cycle;
for(cycle = 0; cycle < cyc_count; cycle++) {
// clrscr();
// SAMPLE; //61
seed = 4.0;
// SAMPLE;
get_data(x,y,n);
// write_data(x,y,n);
// SAMPLE; //66
//----------------------------------------- Calculative part starts
// Accumulating statistics
sumx = 0; sumy = 0; sumxy = 0; sumx2 = 0;
for (k=1; k<=n; k++) {
sumx += x[k];
sumy += y[k];
sumxy += x[k] * y[k];
sumx2 += x[k] * x[k];
}
// Recieving verdict
resa = (sumxy - sumx*sumy/n) / (sumx2 - sumx*sumx/n);
resb = (sumy - resa * sumx) / n;
// SAMPLE; //79
cout << resa << " " << resb;
//------------------------------------------- Calculative part ends
// SAMPLE; //82
}
SAMPLE; //84
}
Список обработанных файлов.
----------------------------------------------------------------------
NN Имя обработанного файла
----------------------------------------------------------------------
1. MAIN_OPT.CPP
----------------------------------------------------------------------
Таблица с результатами измерений ( используется 2 из 416 записей )
----------------------------------------------------------------------
Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)
----------------------------------------------------------------------
1 : 49 1 : 84 2473.22 1 2473.22
----------------------------------------------------------------------
Профилирование оптимизированной программы на С++
(измерение времен выполнения функциональных участков)
#include <Math.h>
#include <IOStream.h>
#include <Conio.h>
#include "Sampler.h"
const pi = 3.14159;
const max = 20;
const cyc_count = 20;
float seed;
float random() {
float x; int i;
x = seed + pi;
x = exp(5.0 * log(x));
seed = x - int(x);
return seed;
}
void get_data(float *x, float *y, int &n) {
const a = 5.0;
const b = 2.0;
int i,j;
float fudge = 0.5;
n = 10;
for (i=1; i<=n; i++) {
j = n + 1 - i;
x[i] = j;
y[i] = (a*j + b) * (1.0 + (2.0 * random() - 1.0) * fudge);
}
}
void write_data(float *x, float *y, int n) {
int i;
for (i = 1; i <= n; i++)
cout << "X[" << i << "]=" << x[i] << "\t\tY[" << i << "]=" << y[i] << "\n";
}
void main() {
SAMPLE; //49
float x[max];
float y[max];
int n;
float sumx,sumy;
float sumxy, sumx2;
int k;
float resa,resb;
int cycle;
for(cycle = 0; cycle < cyc_count; cycle++) {
// clrscr();
SAMPLE; //61
seed = 4.0;
SAMPLE;
get_data(x,y,n);
// write_data(x,y,n);
SAMPLE; //66
//----------------------------------------- Calculative part starts
// Accumulating statistics
sumx = 0; sumy = 0; sumxy = 0; sumx2 = 0;
for (k=1; k<=n; k++) {
sumx += x[k];
sumy += y[k];
sumxy += x[k] * y[k];
sumx2 += x[k] * x[k];
}
// Recieving verdict
resa = (sumxy - sumx*sumy/n) / (sumx2 - sumx*sumx/n);
resb = (sumy - resa * sumx) / n;
SAMPLE; //79
cout << resa << " " << resb;
//------------------------------------------- Calculative part ends
SAMPLE; //82
}
SAMPLE; //84
}
Список обработанных файлов.
----------------------------------------------------------------------
NN Имя обработанного файла
----------------------------------------------------------------------
1. MAIN_OPT.CPP
----------------------------------------------------------------------
Таблица с результатами измерений ( используется 7 из 416 записей )
----------------------------------------------------------------------
Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)
----------------------------------------------------------------------
1 : 49 1 : 61 1.68 1 1.68
----------------------------------------------------------------------
1 : 61 1 : 63 22.63 20 1.13
----------------------------------------------------------------------
1 : 63 1 : 66 95.54 20 4.78
----------------------------------------------------------------------
1 : 66 1 : 79 34.36 20 1.72
----------------------------------------------------------------------
1 : 79 1 : 82 2200.04 20 125.00
----------------------------------------------------------------------
1 : 82 1 : 61 16.76 19 0.88
1 : 82 1 : 84 0.84 1 0.84
----------------------------------------------------------------------
Профилирование программы На Паскале
(измерение времени полного выполнения программы)
program cfit1A;
uses Crt, Sampler;
const max = 20;
cyc_count = 20;
PName: string[10] = 'Main.pas';
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;
begin
x:=seed+pi;
x:=exp(5.0*ln(x));
seed:=x-trunc(x);
random:=seed
end;
procedure get_data(var x,y: ary; var n: integer);
const a = 5.0; b = 2.0;
var i,j : integer;
fudge : real;
BEGIN
fudge := 0.5;
n := 10;
for i:=1 to n do begin
j:=n+1-i;
x[i]:=j;
y[i]:=(a*j + b) * (1.0 + (2.0 * random(0) - 1.0) * fudge);
end
END;
procedure write_data;
{ print out the answers }
var i : integer;
BEGIN
writeln;
writeln(' I X Y');
for i:=1 to n do
writeln(i:3,x[i]:8:1,y[i]:9:2);
writeln
END;
BEGIN
SAMPLE(PName,1); {65}
for cycle := 1 to cyc_count do begin
{ SAMPLE(PName,1); }
ClrScr;
{ SAMPLE(PName,2); }
seed:=4.0;
{ SAMPLE(PNa,3); }
get_data(x,y,n);
{ SAMPLE(PName,4); }
write_data;
{ SAMPLE(PName,5); }
{----------------------------------------- Calculative part starts }
{ Accumulating statistics }
sumx := 0; sumy := 0; sumxy := 0; sumx2 := 0;
for k:=1 to n do begin
sumx := sumx + x[k];
sumy := sumy + y[k];
sumxy := sumxy + x[k] * y[k];
sumx2 := sumx2 + x[k] * x[k];
end;
{ Recieving verdict }
resa := (sumxy - sumx*sumy/n) / (sumx2 - sumx*sumx/n);
resb := (sumy - resa * sumx) / n;
{ SAMPLE(PName,6); }
writeln('Approximated with y=ax+b where a = ',resa,', b=',resb);
{------------------------------------------- Calculative part ends }
{ SAMPLE(PName,7); }
end;
SAMPLE(PName,2); {91}
END.
Список обработанных файлов.
----------------------------------------------------------------------
NN Имя обработанного файла
----------------------------------------------------------------------
1. Main.Pas
----------------------------------------------------------------------
Таблица с результатами измерений ( используется 2 из 416 записей )
----------------------------------------------------------------------
Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)
----------------------------------------------------------------------
1 : 1 1 : 2 30934.07 1 30934.07
----------------------------------------------------------------------
Профилирование программы на Паскале
(измерение времен выполнения функциональных участков)
program cfit1A;
uses Crt, Sampler;
const max = 20;
cyc_count = 20;
PName: string[10] = 'Main.pas';
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;
begin
x:=seed+pi;
x:=exp(5.0*ln(x));
seed:=x-trunc(x);
random:=seed
end;
procedure get_data(var x,y: ary; var n: integer);
const a = 5.0; b = 2.0;
var i,j : integer;
fudge : real;
BEGIN
fudge := 0.5;
n := 10;
for i:=1 to n do begin
j:=n+1-i;
x[i]:=j;
y[i]:=(a*j + b) * (1.0 + (2.0 * random(0) - 1.0) * fudge);
end
END;
procedure write_data;
{ print out the answers }
var i : integer;
BEGIN
writeln;
writeln(' I X Y');
for i:=1 to n do
writeln(i:3,x[i]:8:1,y[i]:9:2);
writeln
END;
BEGIN
for cycle := 1 to cyc_count do begin
SAMPLE(PName,1); {66}
ClrScr;
SAMPLE(PName,2); {68}
seed:=4.0;
SAMPLE(PName,3); {70}
get_data(x,y,n);
SAMPLE(PName,4); {72}
write_data;
SAMPLE(PName,5); {74}
{----------------------------------------- Calculative part starts }
{ Accumulating statistics }
sumx := 0; sumy := 0; sumxy := 0; sumx2 := 0;
for k:=1 to n do begin
sumx := sumx + x[k];
sumy := sumy + y[k];
sumxy := sumxy + x[k] * y[k];
sumx2 := sumx2 + x[k] * x[k];
end;
{ Recieving verdict }
resa := (sumxy - sumx*sumy/n) / (sumx2 - sumx*sumx/n);
resb := (sumy - resa * sumx) / n;
SAMPLE(PName,6); {87}
writeln('Approximated with y=ax+b where a = ',resa,', b=',resb);
{------------------------------------------- Calculative part ends }
SAMPLE(PName,7); {90}
end;
END.
Список обработанных файлов.
----------------------------------------------------------------------
NN Имя обработанного файла
----------------------------------------------------------------------
1. Main.Pas
----------------------------------------------------------------------
Таблица с результатами измерений ( используется 5 из 416 записей )
----------------------------------------------------------------------
Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)
----------------------------------------------------------------------
1 : 1 1 : 2 0.58 20 0.03
----------------------------------------------------------------------
1 : 2 1 : 3 1140.33 20 57.02
----------------------------------------------------------------------
1 : 3 1 : 4 183.91 20 9.20
----------------------------------------------------------------------
1 : 4 1 : 5 29885.92 20 1494.30
----------------------------------------------------------------------
1 : 5 1 : 1 0.32 19 0.02
----------------------------------------------------------------------
Профилирование оптимизированной программы на Паскале
(измерение времени полного выполнения программы)
program cfit1A;
uses Crt,Sampler;
const max = 20;
cyc_count = 20;
PName: string[10] = 'Main.Pas';
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: real;
const pi = 3.14159;
var x : real; i : integer;
begin
x:=seed+pi;
x:=exp(5.0*ln(x));
seed:=x-trunc(x);
random:=seed
end;
procedure get_data(var x,y: ary; var n: integer);
const a = 5.0; b = 2.0;
var i,j : integer;
fudge : real;
BEGIN
fudge := 0.5;
n := 10;
for i:=1 to n do begin
j:=n+1-i;
x[i]:=j;
y[i]:=(a*j + b) * (1.0 + (2.0 * random - 1.0) * fudge);
end
END;
procedure write_data;
{ print out the answers }
var i : integer;
BEGIN
writeln;
writeln(' I X Y');
for i:=1 to n do
writeln(i:3,x[i]:8:1,y[i]:9:2);
writeln
END;
BEGIN
SAMPLE(PName,1); {65}
for cycle := 1 to cyc_count do begin
{ClrScr;}
{ SAMPLE(PName,1); }
seed:=4.0;
{ SAMPLE(PName,2); }
get_data(x,y,n);
{ SAMPLE(PName,3); }
{write_data;}
{----------------------------------------- Calculative part starts }
{ Accumulating statistics }
sumx := 0; sumy := 0; sumxy := 0; sumx2 := 0;
for k:=1 to n do begin
sumx := sumx + x[k];
sumy := sumy + y[k];
sumxy := sumxy + x[k] * y[k];
sumx2 := sumx2 + x[k] * x[k];
end;
{ Recieving verdict }
resa := (sumxy - sumx*sumy/n) / (sumx2 - sumx*sumx/n);
resb := (sumy - resa * sumx) / n;
{ SAMPLE(PName,4); }
writeln(resa,' ',resb);
{------------------------------------------- Calculative part ends }
{ SAMPLE(PName,5); }
end;
SAMPLE(PName,2); {91}
END.
Список обработанных файлов.
----------------------------------------------------------------------
NN Имя обработанного файла
----------------------------------------------------------------------
1. Main.pas
----------------------------------------------------------------------
Таблица с результатами измерений ( используется 2 из 416 записей )
----------------------------------------------------------------------
Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)
----------------------------------------------------------------------
1 : 1 1 : 2 6506.21 1 6506.21
----------------------------------------------------------------------
Профилирование оптимизированной программы на Паскале
(измерение времен выполнения функциональных участков)
program cfit1A;
uses Crt,Sampler;
const max = 20;
cyc_count = 20;
PName: string[10] = 'Main.Pas';
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: real;
const pi = 3.14159;
var x : real; i : integer;
begin
x:=seed+pi;
x:=exp(5.0*ln(x));
seed:=x-trunc(x);
random:=seed
end;
procedure get_data(var x,y: ary; var n: integer);
const a = 5.0; b = 2.0;
var i,j : integer;
fudge : real;
BEGIN
fudge := 0.5;
n := 10;
for i:=1 to n do begin
j:=n+1-i;
x[i]:=j;
y[i]:=(a*j + b) * (1.0 + (2.0 * random - 1.0) * fudge);
end
END;
procedure write_data;
{ print out the answers }
var i : integer;
BEGIN
writeln;
writeln(' I X Y');
for i:=1 to n do
writeln(i:3,x[i]:8:1,y[i]:9:2);
writeln
END;
BEGIN
for cycle := 1 to cyc_count do begin
{ClrScr;}
SAMPLE(PName,1);
seed:=4.0;
SAMPLE(PName,2);
get_data(x,y,n);
SAMPLE(PName,3);
{write_data;}
{----------------------------------------- Calculative part starts }
{ Accumulating statistics }
sumx := 0; sumy := 0; sumxy := 0; sumx2 := 0;
for k:=1 to n do begin
sumx := sumx + x[k];
sumy := sumy + y[k];
sumxy := sumxy + x[k] * y[k];
sumx2 := sumx2 + x[k] * x[k];
end;
{ Recieving verdict }
resa := (sumxy - sumx*sumy/n) / (sumx2 - sumx*sumx/n);
resb := (sumy - resa * sumx) / n;
SAMPLE(PName,4);
writeln(resa,' ',resb);
{------------------------------------------- Calculative part ends }
SAMPLE(PName,5);
end;
END.
Список обработанных файлов.
----------------------------------------------------------------------
NN Имя обработанного файла
----------------------------------------------------------------------
1. Main.pas
----------------------------------------------------------------------
Таблица с результатами измерений ( используется 7 из 416 записей )
----------------------------------------------------------------------
Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)
----------------------------------------------------------------------
1 : 1 1 : 2 2826.22 20 141.31
----------------------------------------------------------------------
1 : 2 1 : 3 0.35 20 0.02
----------------------------------------------------------------------
1 : 3 1 : 4 1163.17 20 58.16
----------------------------------------------------------------------
1 : 4 1 : 5 2101.97 20 105.10
----------------------------------------------------------------------
1 : 5 1 : 6 185.66 20 9.28
----------------------------------------------------------------------
1 : 6 1 : 7 226.63 20 11.33
----------------------------------------------------------------------
1 : 7 1 : 1 0.38 19 0.02
----------------------------------------------------------------------
Вывод
Проанализировав характеристики программы, была проведена оптимизация, что сократило общее время ее выполнения. Время работы программы на С++ сократилось с 126.55 мкс до 71.24 мкс. Время работы программы на Паскале сократилось с 214.01 мкс до 110.31 мкс. Временные характеристики, полученные TurboProfiler в несколько раз больше временных характеристик, полученных SAMPLER. SAMPLER позволяет измерять характеристики программ с незначительными дополнительными накладными расходами, влияющих на качество профилирования.