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

Профилирование программы На С++

(измерение времени полного выполнения программы)

#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 позволяет измерять характеристики программ с незначительными дополнительными накладными расходами, влияющих на качество профилирования.

Соседние файлы в папке labO3