- •Постановка задачи
- •Выполнение работы
- •Профилирование программы porost0.C
- •Профилирование программы test_cyc.C
- •Профилирование программы test_sub.C
- •1000*1000 Повторений
- •2000*1000 Повторений
- •5000*1000 Повторений
- •10000*1000 Повторений
- •Профилирование программы QuickSort.Cpp
- •Профилирование программы QuickSort.Pas
-
Профилирование программы 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. |
|
|
|
|
|
|
|
-
Выводы
В результате выполнения работы удалось установить следующие особенности профилировщика VTune:
• способ взятия проб на основании событий процессора (event-based) дает более подробные и точные результаты нежели способ на основании промежутков времени (time-based);
• с другой стороны, результаты time-based sampling в целом похожи на результаты, полученные с помощью event-based sampling;
• на основании тестовой программы test_cyc.c удалось установить, что VTune обрабатывает одинаково записанные разными способами инструкции;
• цели, которые преследовала программа test_sub.c (а именно время работы функций с разными параметрами) достигнуть в профилиров щике не удалось;
Применительно к программам быстрой сортировки удалось установить следующее:
• результаты зацикленной программы быстрой сортировки не сильно различаются для time-based и event-based способов получения образцов (что впрочем не отменяет большую точность второго способа);
• показания для объектного кода, сгенерированного различными компиляторами с различных языков различаются при обоих способах получения образцов.
• наиболее эффективным местом (с точки зрения повышения скорости программы) для внесения изменений следует считать проверки условий, которые требуют нескольких сравнений одновременно. Эти участки кода выполняются очень часто и повышение их эффективности может дать прирост производительности.