Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные работы № 2 и 3

.pdf
Скачиваний:
25
Добавлен:
01.05.2014
Размер:
329.29 Кб
Скачать

2 Выполнение работы

11

44}

45pivot = x[j];

46while (i < j) {

4731.51\% while (x[i] < pivot) {

48

0.68\%

i++;

49

 

}

50

4.79\%

j--;

51

15.07\%

while ((i < j) && (pivot < x[j])) {

52

0.68\%

j--;

53

 

}

54

5.48\%

if (i < j) {

55

 

swap(x[i], x[j]);

56}

57}

58j = right[sp];

59

1.37\%

swap(x[i], x[j]);

60

 

if (i - left[sp] >= right[sp] - i) {

61

0.68\%

left[sp+1]

= left[sp];

62

0.68\%

right[sp+1] = i - 1;

63

1.37\%

left[sp] = i +

1;

64}

65else {

66left[sp+1] = i + 1;

67right[sp+1] = right[sp];

68right[sp] = i - 1;

69}

70 0.68%

sp++;

71}

72}

73}

75bool verify(TArray &x, int dim) {

76int i = 0;

77while ((x[i] <= x[i+1]) && (i+1 <= dim)) {

78i++;

79}

800.68\% if (i == dim) {

81return true;

82}

83else {

84return false;

85}

87 }

89void init(TArray &x, int dim) {

904.11\% for (int i = 0; i <= dim; i++) {

91

1.37\%

x[i] = random(100);

92

 

}

94

 

}

96void main() {

97TArray a;

98int n = 19;

99randomize();

100for (int t = 0; t <= 31999; t++) {

101init(a, n);

102qsort(a, n);

103verify(a, n);

104}

105return;

106}

Event-Based Sampling

6#include <stdlib.h>

8typedef double TArray[20];

10

0.44\%

void swap(double &p, double &q) {

11

0.69\%

double tmp = p;

12

0.84\%

p = q;

13

0.82\%

q = tmp;

14

0.60\%

}

16

0.00\%

void qsort(TArray &x, int n) {

17int left[21];

18int right[21];

19

0.00\%

left[1] = 1;

20

0.01\%

right[1] = n;

 

 

 

2

Выполнение работы

12

21

0.00\%

int

sp = 1;

 

22

0.01\%

int

i = 0;

 

23

0.00\%

int

j = 0;

 

24

0.00\%

int

mid = 0;

 

25

 

double pivot;

 

26

1.22\%

while (sp) {

 

27

1.61\%

if (left[sp] >= right[sp]) {

 

28

0.19\%

 

sp--;

 

29

1.15\%

}

 

 

30

 

else {

 

 

31

1.43\%

 

i = left[sp];

 

32

0.19\%

 

j = right[sp];

 

33

0.99\%

 

pivot = x[j];

 

34

0.48\%

 

mid = ((i+j) / 2);

 

35

0.22\%

 

if ((j - i) > 5) {

 

36

5.19\%

if ( ((x[mid] < pivot) && (x[mid] > x[i])) ||

 

 

 

 

((x[mid] > pivot) && (x[mid] < x[i])) ) {

 

37

0.42\%

 

swap(x[mid], x[j]);

 

38

0.01\%

}

 

 

39

 

else {

 

 

40

1.37\%

 

if ( ((x[i] < x[mid]) && (x[i] > pivot)) ||

 

 

 

 

((x[i] > x[mid]) && (x[i] < pivot)) ) {

 

41

0.28\%

 

swap(x[i], x[j]);

 

42

 

 

}

 

43}

44}

45

1.01\%

pivot = x[j];

46

1.67\%

while (i < j) {

47

29.69\%

while (x[i] < pivot) {

48

0.72\%

i++;

49

 

}

50

5.17\%

j--;

51

12.99\%

while ((i < j) && (pivot < x[j])) {

52

0.32\%

j--;

53

 

}

54

5.07\%

if (i < j) {

55

1.69\%

swap(x[i], x[j]);

56}

57}

58

0.31\%

 

j = right[sp];

59

1.13\%

 

swap(x[i], x[j]);

60

0.68\%

 

if (i - left[sp] >= right[sp] - i) {

61

0.67\%

 

left[sp+1] = left[sp];

62

0.19\%

 

right[sp+1] = i - 1;

63

0.34\%

left[sp] = i + 1;

64

0.17\%

 

}

65

 

else

{

66

0.76\%

 

left[sp+1] = i + 1;

67

0.23\%

right[sp+1] = right[sp];

68

0.22\%

 

right[sp] = i - 1;

69

 

}

 

70

0.17\%

 

sp++;

71

 

}

 

72

 

}

 

73

0.35\%

}

 

75

0.02\%

bool verify(TArray &x, int dim) {

76

0.02\%

int

i = 0;

77

1.08\%

while ((x[i] <= x[i+1]) && (i+1 <= dim)) {

78

0.00\%

i++;

79}

800.05\% if (i == dim) {

81 0.02\%

return true;

82}

83else {

84

0.00\%

return false;

85

 

}

86

 

 

87

0.02\%

}

89

0.02\%

void init(TArray &x, int dim) {

90

3.68\%

for (int i = 0; i <= dim; i++) {

91

2.10\%

x[i] = random(100);

92

 

}

93

 

 

94

0.02\%

}

 

 

 

4 SAMPLER наносит ответный удар

13

96void main() {

97TArray a;

98int n = 19;

99randomize();

1000.03\% for (int t = 0; t <= 31999; t++) {

101

0.03\%

init(a, n);

102

0.04\%

qsort(a, n);

103

0.06\%

verify(a, n);

104}

105return;

106}

107

3.Заключение

Врезультате выполнения работы удалось установить следующие особенности профилировщика VTune:

способ взятия проб на основании событий процессора (event-based) дает более подробные и точные результаты нежели способ на основании промежутков времени (time-based);

с другой стороны, результаты time-based sampling в целом похожи на результаты, полученные с помощью event-based sampling;

на основании тестовой программы test_cyc.c удалось установить, что VTune обрабатывает одинаково записанные разными способами инструкции;

цели, которые преследовала программа test_sub.c (а именно время работы функций с разными параметрами) достигнуть в профилировщике не удалось;

Применительно к программам быстрой сортировки удалось установить следующее:

результаты зацикленной программы быстрой сортировки не сильно различаются для time-based и event-based способов получения образцов (что впрочем не отменяет большую точность второго способа);

показания для объектного кода, сгенерированного различными компиляторами с различных языков различаются при обоих способах получения образцов.

наиболее эффективным местом (с точки зрения повышения скорости программы) для внесения изменений следует считать проверки условий, которые требуют нескольких сравнений одновременно. Эти участки кода выполняются очень часто и повышение их эффективности может дать прирост производительности.

4.Sampler наносит ответный удар

Компиляция программ выполнялась под Borland Pascal 7 и Turbo C++ 3.0.

4 SAMPLER наносит ответный удар

14

4.1. test_cyc.cpp

Листинг 3. test_cyc.c (C)

void main()

{

SAMPLE;

for(i=0;i<Size/10;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };

5SAMPLE;

for(i=0;i<Size/5;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; }; SAMPLE;

for(i=0;i<Size/2;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; }; SAMPLE;

10for(i=0;i<Size;i++) { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; }; SAMPLE;

for(i=0;i<Size/10;i++)

{ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; }; SAMPLE;

15for(i=0;i<Size/5;i++)

{tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; }; SAMPLE;

for(i=0;i<Size/2;i++)

{tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };

20SAMPLE; for(i=0;i<Size;i++)

{tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; }; SAMPLE;

for(i=0;i<Size/10;i++)

25 { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp;

};

SAMPLE;

30for(i=0;i<Size/5;i++)

{tmp=dim[0];

dim[0]=dim[i];

dim[i]=tmp;

};

35SAMPLE; for(i=0;i<Size/2;i++)

 

 

 

{ tmp=dim[0];

 

 

 

 

 

 

dim[0]=dim[i];

 

 

 

 

 

 

dim[i]=tmp;

 

 

 

40

 

 

};

 

 

 

 

 

 

 

 

SAMPLE;

 

 

 

 

 

 

 

for(i=0;i<Size;i++)

 

 

 

 

 

{ tmp=dim[0];

 

 

 

 

 

 

dim[0]=dim[i];

 

 

 

45

 

 

dim[i]=tmp;

 

 

 

 

 

 

};

 

 

 

 

 

}

 

SAMPLE;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таблица с результатами измерений ( используется 13 из 416 записей )

Исх.Поз. Прием.Поз.

Общее время(мкс)

Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1

:

8

1 :

10

4.19

1

4.19

----------------------------------------------------------------------

1

:

10

1 :

12

7.54

1

7.54

----------------------------------------------------------------------

1

:

12

1 :

14

20.11

1

20.11

----------------------------------------------------------------------

1

:

14

1 :

16

40.23

1

40.23

----------------------------------------------------------------------

1

:

16

1 :

19

3.35

1

3.35

----------------------------------------------------------------------

1

:

19

1 :

22

8.38

1

8.38

----------------------------------------------------------------------

1

:

22

1 :

25

20.11

1

20.11

----------------------------------------------------------------------

1

:

25

1 :

28

39.39

1

39.39

----------------------------------------------------------------------

4 SAMPLER наносит ответный удар

 

15

1

:

28

1

:

34

4.19

1

4.19

----------------------------------------------------------------------

1

:

34

1

:

40

8.38

1

8.38

----------------------------------------------------------------------

1

:

40

1

:

46

20.11

1

20.11

----------------------------------------------------------------------

1

:

46

1

:

52

203.66

1

203.66

4.2. test_sub.c

Листинг 4. test_sub.c (C)

void TestLoop(int nTimes)

{

static int TestDim[Size]; int tmp;

5int iLoop;

while (nTimes > 0)

{

nTimes −−;

10

iLoop = Size; while (iLoop > 0)

{

iLoop −− ;

15tmp = TestDim[0];

TestDim[0] = TestDim[nTimes]; TestDim[nTimes] = tmp;

}

}

20 } / TestLoop /

void main()

{

SAMPLE;

25TestLoop(Size / 10); // 100 1000

SAMPLE;

TestLoop(Size / 5); // 200 1000 SAMPLE;

TestLoop(Size / 2); // 500 1000

30SAMPLE;

TestLoop(Size / 1); // 1000 1000 SAMPLE;

}

Таблица с результатами измерений ( используется 5 из 416 записей )

Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1 : 29 1 : 31 227.12 1 227.12

----------------------------------------------------------------------

1 : 31 1 : 33 620.19 1 620.19

----------------------------------------------------------------------

1 : 33 1 : 35 1175.85 1 1175.85

----------------------------------------------------------------------

1 : 35 1 : 37 2453.11 1 2453.11

4.3. Быстрая сортировка

4.3.1. Pascal

Полное время работы

Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1 : 1 1 : 2 205.33 1 205.33

4 SAMPLER наносит ответный удар

16

Время функциональных участков

 

Исх.Поз. Прием.Поз.

Общее время(мкс)

Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1

:

1

1

:

2

0.84

1

0.84

----------------------------------------------------------------------

1

:

2

1

:

3

37.71

1

37.71

----------------------------------------------------------------------

1

:

3

1

:

11

0.00

1

0.00

----------------------------------------------------------------------

1

:

4

1

:

5

15.92

1

15.92

----------------------------------------------------------------------

1

:

11

1

:

12

0.00

1

0.00

----------------------------------------------------------------------

1

:

12

1

:

13

0.00

1

0.00

----------------------------------------------------------------------

1

:

13

1

:

14

0.00

71

0.00

1

:

13

1

:

13

126.55

71

1.78

1

:

13

1

:

24

0.00

1

0.00

----------------------------------------------------------------------

1

:

14

1

:

15

6.70

6

1.12

1

:

14

1

:

17

157.56

63

2.50

1

:

14

1

:

16

2.51

2

1.26

----------------------------------------------------------------------

1

:

15

1

:

17

0.00

6

0.00

----------------------------------------------------------------------

1

:

16

1

:

17

0.84

2

0.42

----------------------------------------------------------------------

1

:

17

1

:

19

12.57

71

0.18

----------------------------------------------------------------------

1

:

19

1

:

20

154.21

191

0.81

----------------------------------------------------------------------

1

:

20

1

:

21

693.94

191

3.63

----------------------------------------------------------------------

1

:

21

1

:

19

264.84

120

2.21

1

:

21

1

:

22

124.88

71

1.76

----------------------------------------------------------------------

1

:

22

1

:

23

124.88

71

1.76

----------------------------------------------------------------------

1

:

23

1

:

13

274.06

71

3.86

----------------------------------------------------------------------

1

:

24

1

:

4

0.00

1

0.00

4.3.2.

C

 

 

 

 

 

Полное время работы

 

 

Исх.Поз. Прием.Поз.

Общее время(мкс)

Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1

: 107

1

: 117

24.30

1

24.30

Время функциональных участков

 

Исх.Поз. Прием.Поз.

Общее время(мкс)

Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1

:

14

1

:

24

0.84

1

0.84

----------------------------------------------------------------------

1

:

24

1

:

26

3.35

1

3.35

----------------------------------------------------------------------

1

:

26

1

:

35

11.73

12

0.98

1

:

26

1

:

26

10.90

12

0.91

1

:

26

1

:

82

0.84

1

0.84

----------------------------------------------------------------------

1

:

35

1

:

43

10.90

3

3.63

1

:

35

1

:

48

7.54

9

0.84

----------------------------------------------------------------------

1

:

43

1

:

48

5.87

3

1.96

----------------------------------------------------------------------

1

:

48

1

:

54

10.90

12

0.91

----------------------------------------------------------------------

1

:

54

1

:

59

21.79

24

0.91

 

 

 

 

 

 

 

 

 

5

 

Заключение

 

 

17

----------------------------------------------------------------------

1

:

59

1

:

63

20.95

24

0.87

----------------------------------------------------------------------

1

:

63

1

:

54

11.73

12

0.98

1

:

63

1

:

65

10.06

12

0.84

----------------------------------------------------------------------

1

:

65

1

:

79

12.57

12

1.05

----------------------------------------------------------------------

1

:

79

1

:

26

7.54

12

0.63

----------------------------------------------------------------------

1

:

82

1

: 115

0.84

1

0.84

----------------------------------------------------------------------

1

: 107

1

: 111

5.03

1

5.03

----------------------------------------------------------------------

1

: 111

1

: 113

5.87

1

5.87

----------------------------------------------------------------------

1

: 113

1

:

14

0.84

1

0.84

----------------------------------------------------------------------

1

: 115

1

: 117

2.51

1

2.51

5.Заключение

Врезультате работы с профилировщиком Sample удалось установить:

время работы с библиотеками Sampler, откомпилированным под Pascal на отдельных участках значительно превосходит время работы с модулями C, что, с другой стороны, можно списать на исполнение Sampler не в родной ему операционной системе. В связи с этим тяжело сделать заключение о похожести характеристик модулей на различных языках;

на основании тестовых программы test_cyc.c, test_sub.c удалось установить, что Sampler обрабатывает одинаково записанные разными способами инструкции и перенесенные в подпрограммы инструкции;

полученные с использованием Sampler результаты в целом согласуются с результатами, полученными с использованием VTune.

А Разметка для SAMPLER

18

А. Разметка для Sampler

Листинг 5. Быстрая сортировка (Pascal)

program prog_pas;

uses sampler;

5const

N = 100;

name = "prog_pas.pas";

type

10 TArray = array [1..N] of real;

procedure swap(var p,q: real); var hold : real ;

begin

15hold:=p;

p:=q;

q:=hold end;

20 procedure qsort(var x: TArray; n: integer);

var left , right

:

array [1..20] of integer ;

i , j ,sp,mid

:

integer ;

pivot

:

real ;

25

begin sample(name, 11); left [1]:=1;

right [1]:=n;

30sp:=1; sample(name, 12); while sp>0 do

begin sample(name, 13);

35 if left [sp]>=right[sp] then begin sp:=sp−1

end

else begin

i:=left [sp ];

40j:=right[sp ]; pivot:=x[j ]; mid:=(i+j)div 2;

sample(name, 14); if ( j−i)>5 then begin

45 if ((x[mid]<pivot)and(x[mid]>x[i])) or ((x[mid]>pivot)and(x[mid]<x[i])) then begin

sample(name, 15); swap(x[mid],x[j ])

end

else begin

50if ((x[ i]<x[mid])and(x[i]>pivot)) or ((x[i]>x[mid])and(x[i]<pivot)) then begin sample(name, 16);

swap(x[i ], x[j ]) ;

 

end;

 

end;

55

end;

 

sample(name, 17);

 

pivot:=x[j ];

 

while i<j do begin

60

while x[i]<pivot do begin

 

i:=i+1;

 

end;

 

sample(name, 19);

 

j:=j−1;

65

while (i<j)and(pivot<x[j]) do begin

j:=j−1; end;

sample(name, 20);

А

Разметка для SAMPLER

19

 

 

if i<j then swap(x[i],x[j ]) ;

 

70

 

sample(name, 21);

 

 

 

end;

 

 

 

sample(name, 22);

 

 

 

j:=right[sp ]; { pivot to i }

 

 

 

swap(x[i ], x[j ]) ;

 

75

 

if i−left[sp]>=right[sp]−i then begin

 

 

 

left [sp+1]:=left[sp ];

 

 

 

right [sp+1]:=i−1;

 

 

 

left [sp]:=i+1

 

 

 

end

 

80

 

else begin

 

 

 

left [sp+1]:=i+1;

 

right [sp+1]:=right[sp]; right [sp]:=i−1

end;

85sp:=sp+1; sample(name, 23);

end; end;

sample(name, 24);

90end;

function verify(var x: TArray; dim: integer) : boolean; var

i : integer ;

95begin

i := 1;

while (x[i] <= x[i+1]) and (i+1 <= dim) do begin i := i+1;

end;

100 if ( i = dim) then verify := true

else

verify := false ; end;

105

procedure init(var x: TArray; dim: integer); var

i : integer ; begin

110 for i := 1 to dim do begin x[ i ] := random(100);

end; end;

115 var

a: TArray; t : integer ;

begin sample(name, 1);

120randomize; sample(name, 2);

init (a, n); sample(name, 3); qsort(a, n);

125 sample(name, 4); verify (a, n);

sample(name, 5); end.

Листинг 6. Быстрая сортировка (C)

#include <stdlib.h> #include <stdio.h> #include "sampler.h"

5typedef double TArray[21];

void swap(double &p, double &q) {

double tmp = p; p = q;

10 q = tmp;

}

А Разметка для SAMPLER

20

void qsort(TArray x, int n) { SAMPLE;

15int left [21]; int right [21]; left [1] = 1;

right [1] = n; int sp = 1;

20int i = 0; int j = 0; int mid = 0; double pivot; SAMPLE;

25 while (sp) { SAMPLE;

if ( left [sp] >= right[sp]) { sp−−;

}

30else {

i = left [sp ]; j = right[sp ]; pivot = x[j ];

 

mid = ((i+j) / 2);

35

SAMPLE;

 

if (( j − i) > 5) {

if

( (( x[mid] < pivot) && (x[mid] > x[i])) || (( x[mid] > pivot) && (x[mid] < x[i])) ) {

 

SAMPLE;

 

swap(x[mid], x[j ]) ;

40}

else {

 

if ( (( x[ i ] < x[mid]) && (x[i] > pivot)) || (( x[ i ] > x[mid]) && (x[i] < pivot)) ) {

 

SAMPLE;

 

swap(x[i ], x[j ]) ;

45

}

 

}

 

}

 

SAMPLE;

 

pivot = x[j ];

50

while (i < j) {

while (x[ i ] < pivot) { i++;

}

SAMPLE;

55j−−;

while ((i < j) && (pivot < x[j])) { j−−;

}

SAMPLE;

60 if ( i < j) { swap(x[i ], x[j ]) ;

}

SAMPLE;

}

65SAMPLE;

j = right[sp ];

swap(x[i ], x[j ]) ;

if ( i − left [sp] >= right[sp] − i) { left [sp+1] = left[sp ];

70right [sp+1] = i − 1; left [sp] = i + 1;

}

else {

left [sp+1] = i + 1;

75

right [sp+1] = right[sp ];

 

right [sp] = i − 1;

 

}

 

sp++;

 

SAMPLE;

80

}

 

}

 

SAMPLE;

 

}

85

int verify (TArray &x, int dim) {