Скачиваний:
24
Добавлен:
01.05.2014
Размер:
627.71 Кб
Скачать
  1. Профилирование программы QuickSort.Pas

Address

Line

Source

Clockticks (EBS)

Timer (TBS)

 

1

program Project1;

 

 

 

2

 

 

 

3

{$APPTYPE CONSOLE}

 

 

 

4

 

 

 

5

uses

 

 

 

6

SysUtils;

 

 

 

7

type Tarr = array [1..8] of real;

 

 

 

8

 

 

 

9

var mass: Tarr; j: integer;

 

 

 

10

 

 

 

11

procedure QuickSort(var x: Tarr; n: integer);

 

 

 

12

var left,right : array[1..20] of integer;

 

 

 

13

i,j,sp,mid : integer;

 

 

 

14

pivot : real;

 

 

 

15

 

 

 

16

procedure swap(var p,q: real);

 

 

 

17

var hold : real;

 

 

 

18

 

 

0x7C60

19

begin

12

14

0x7C6C

20

hold:=p;

21

22

0x7C7A

21

p:=q;

29

18

0x7C8A

22

q:=hold

5

16

0x7C98

23

end; { swap }

3

6

 

24

 

 

 

25

 

 

0x7C9C

26

begin

1

1

0x7CAB

27

left[1]:=1;

 

 

0x7CB2

28

right[1]:=n;

 

 

0x7CBB

29

sp:=1;

 

1

0x7CC2

30

while sp>0 do

21

28

 

31

begin

 

 

0x7CCC

32

if left[sp]>=right[sp] then sp:=sp-1

56

64

 

33

else

 

 

 

34

begin

 

 

0x7CE7

35

i:=left[sp];

 

3

0x7CF1

36

j:=right[sp];

3

5

0x7CFE

37

pivot:=x[j];

43

32

0x7D12

38

mid:=(i+j)div 2;

7

15

0x7D22

39

if (j-i)>5 then

4

7

0x7D31

40

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

10

9

0x7D87

41

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

1

3

 

42

else

 

 

0x7DA4

43

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

 

 

0x7DFA

44

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

 

 

0x7E15

45

pivot:=x[j];

13

14

0x7E29

46

while i<j do

10

18

 

47

begin

 

 

0x7E33

48

while x[i]<pivot do i:=i+1;

88

100

0x7E48

49

j:=j-1;

14

14

0x7E4D

50

while (i<j)and(pivot<x[j]) do j:=j-1;

18

28

0x7E6A

51

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

4

6

 

52

end; { while }

 

 

0x7E95

53

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

2

4

0x7EA2

54

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

24

15

0x7EBD

55

if i-left[sp]>=right[sp]-i then

59

38

 

56

begin { put shorter part first }

 

 

0x7ED8

57

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

6

11

0x7EE6

58

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

8

9

0x7EF4

59

left[sp]:=i+1

28

20

 

60

end

 

 

 

61

else

 

 

 

62

begin

 

 

0x7F01

63

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

4

3

0x7F0C

64

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

1

 

0x7F20

65

right[sp]:=i-1

 

 

 

66

end;

 

 

0x7F2E

67

sp:=sp+1 { push stack }

3

5

 

68

end { if }

 

 

 

69

end { while }

 

 

0x7F3B

70

end; { QUICK SORT }

2

1

 

71

 

 

 

72

 

 

 

73

 

 

 

74

 

 

 

75

 

 

0x7FA8

76

begin

 

 

 

77

 

 

0x7FC0

78

for j:=8 downto 1 do

 

1

 

79

begin

 

 

0x7FCA

80

for j:=8 downto 1 do

24

46

 

81

begin

 

 

0x7FD4

82

mass[j]:= j;

14

22

 

83

//writeln (mass[j]);

 

 

0x7FE7

84

end;

 

 

0x7FF6

85

QuickSort(mass, 8);

 

1

 

86

//writeln ('=======');

 

 

 

87

//for j:=1 to 8 do writeln (mass[j]);

 

 

 

88

//readln;

 

 

0x8005

89

2

 

0x8017

90

end.

 

 

 

 

 

 

 

  1. Выводы

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

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

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

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

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

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

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

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

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

9

Соседние файлы в папке Лабораторная работа №2
  • #
    01.05.201470.66 Кб24Lab2_sempl_results.xls
  • #
    01.05.2014627.71 Кб24LAB_2.doc