- •_________________________
- •1. Профилирование prost0.Exe
- •1.1. Отчет по модулям
- •1.2. Отчет по процессам
- •1.3. Представление результатов в исходном коде
- •1.4. Граф вызова функций
- •2. Профилирование test_cyc.C
- •2.1. Отчет по процессам
- •2.2. Отчет по модулям
- •2.3. Представление результатов в исходном коде
- •2.4 Граф вызова функций
- •3. Профилирование test_sub.C
- •3.3 Исследование влияния параметров циклов на точность профилировки
- •4. Профилирование программы из лабораторной работы 1
- •4.1. Отчет по модулям
- •4.2. Отчет по процессам
- •4.3. Представление результатов в исходном коде
- •4.4 Граф вызова функций
Министерство Образования Российской Федерации
Санкт-Петербургский Государственный Электротехнический Университет «ЛЭТИ»
_________________________
кафедра МО ЭВМ
Отчет
по лабораторной работе №2
вариант 6
Выполнила: Кононова В.М.
гр. 3351
Проверил: Боханова Е.В.
Санкт-Петербург, 2007г.
1. Профилирование prost0.Exe
1.1. Отчет по модулям
Как видно из диаграммы, при работе программы в основном используется модуль самой программы prost0.exe.
1.2. Отчет по процессам
Process |
Module |
CPU% |
Samples |
PID |
32-bit |
16-bit |
V8086 |
prost0.exe |
prost0.exe |
26,6 |
5447 |
2764 |
5447 |
0 |
0 |
prost0.exe |
ntoskrnl.exe |
0,3 |
66 |
2764 |
66 |
0 |
0 |
prost0.exe |
LTSMT.sys |
0,2 |
42 |
2764 |
42 |
0 |
0 |
prost0.exe |
hal.dll |
0,2 |
33 |
2764 |
33 |
0 |
0 |
prost0.exe |
kernel32.dll_7 |
0,1 |
12 |
2764 |
12 |
0 |
0 |
prost0.exe |
ntdll.dll |
0 |
9 |
2764 |
9 |
0 |
0 |
prost0.exe |
pcmcia.sys |
0 |
3 |
2764 |
3 |
0 |
0 |
prost0.exe |
Other32B |
0 |
3 |
2764 |
3 |
0 |
0 |
prost0.exe |
portcls.sys |
0 |
2 |
2764 |
2 |
0 |
0 |
prost0.exe |
USBPORT.SYS |
0 |
1 |
2764 |
1 |
0 |
0 |
prost0.exe |
e100b325.sys |
0 |
1 |
2764 |
1 |
0 |
0 |
prost0.exe |
VIDEOPRT.SYS |
0 |
1 |
2764 |
1 |
0 |
0 |
prost0.exe |
NDIS.sys |
0 |
1 |
2764 |
1 |
0 |
0 |
prost0.exe |
ds1wdm.sys |
0 |
1 |
2764 |
1 |
0 |
0 |
prost0.exe |
rdbss.sys |
0 |
1 |
2764 |
1 |
0 |
0 |
prost0.exe |
tcpip.sys |
0 |
1 |
2764 |
1 |
0 |
0 |
При профилировании только 27,4% времени ЦП было исследуемому процессу prost0.exe, остальное время - на выполнение системных процессов.
1.3. Представление результатов в исходном коде
Address |
Line |
relative |
absolute |
counts |
Source |
|
1 |
|
|
|
#include "stdio.h"; |
|
2 |
|
|
|
|
|
3 |
|
|
|
int primes[200000]; |
|
4 |
|
|
|
#define MAXPRIMES 200000 |
|
5 |
|
|
|
|
|
6 |
|
|
|
main() |
01:0010 |
7 |
|
|
|
{ |
|
8 |
|
|
|
int j; |
|
9 |
|
|
|
int lastprime, curprime; |
|
10 |
|
|
|
|
01:0028 |
11 |
|
|
|
primes[0] = 2; |
01:0032 |
12 |
|
|
|
primes[1] = 3; |
01:003C |
13 |
|
|
|
lastprime = 1; |
01:0043 |
14 |
|
|
|
curprime = 3; |
|
15 |
|
|
|
|
01:004A |
16 |
|
|
|
printf(prime %d = %d\n", 0, primes[0]);" |
01:005F |
17 |
|
|
|
printf(prime %d = %d\n", 1, primes[1]);" |
|
18 |
|
|
|
|
01:0075 |
19 |
|
|
|
while(curprime < MAXPRIMES) |
|
20 |
|
|
|
{ |
01:007E |
21 |
7,47% |
1,99% |
407 |
for(j = 0; j <= lastprime; j++) |
01:0098 |
22 |
87,63% |
23,30% |
4773 |
if((curprime % primes[j]) == 0) |
|
23 |
|
|
|
{ |
01:00AA |
24 |
0,02% |
0,00% |
1 |
curprime += 2; |
|
25 |
|
|
|
|
01:00B3 |
26 |
|
|
|
break; |
|
27 |
|
|
|
} |
01:00B5 |
28 |
2,40% |
0,64% |
131 |
if(j <= lastprime) |
01:00BF |
29 |
|
|
|
continue; |
01:00C1 |
30 |
|
|
|
lastprime++; |
01:00CA |
31 |
|
|
|
printf(prime %d = %d\n", lastprime, curprime);" |
01:00DF |
32 |
0,02% |
0,00% |
1 |
primes[lastprime] = curprime; |
01:00EC |
33 |
|
|
|
curprime += 2; |
01:00F5 |
34 |
|
|
|
} |
01:00FA |
35 |
|
|
|
} |
|
36 |
|
|
|
|
Из анализа результатов видно, что узкое место программы - строка 22: доступ к элементу массива, операция взятия по модулю, условный оператор.
Попробуем разнести эти операторы, чтобы узнать, выполнение которого из них занимает больше времени.
Address |
Line |
Clockticks |
Source |
|
1 |
|
#include "stdio.h"; |
|
2 |
|
|
|
3 |
|
int primes[200000]; |
|
4 |
|
#define MAXPRIMES 200000 |
|
5 |
|
|
|
6 |
|
main() |
01:0010 |
7 |
|
{ |
|
8 |
|
int j; |
|
9 |
|
int lastprime, curprime; |
|
10 |
|
|
01:0028 |
11 |
|
primes[0] = 2; |
01:0032 |
12 |
|
primes[1] = 3; |
01:003C |
13 |
|
lastprime = 1; |
01:0043 |
14 |
|
curprime = 3; |
|
15 |
|
|
01:004A |
16 |
|
printf(prime %d = %d\n", 0, primes[0]);" |
01:005F |
17 |
|
printf(prime %d = %d\n", 1, primes[1]);" |
|
18 |
|
|
01:0075 |
19 |
|
while(curprime < MAXPRIMES) |
|
20 |
|
{ |
01:0082 |
21 |
8,52% |
for(j = 0; j <= lastprime; j++) |
|
22 |
|
{ |
01:009C |
23 |
3,57% |
int p = primes[j]; |
01:00A9 |
24 |
68,09% |
int mod = curprime%p; |
01:00B3 |
25 |
15,33% |
if((mod) == 0) |
|
26 |
|
{ |
01:00B9 |
27 |
0,04% |
curprime += 2; |
|
28 |
|
|
01:00C2 |
29 |
|
break; |
|
30 |
|
} |
01:00C4 |
31 |
2,32% |
} |
01:00C6 |
32 |
|
if(j <= lastprime) |
01:00CE |
33 |
|
continue; |
01:00D0 |
34 |
|
lastprime++; |
01:00D9 |
35 |
|
printf(prime %d = %d\n", lastprime, curprime);" |
01:00EE |
36 |
0,02% |
primes[lastprime] = curprime; |
01:00FB |
37 |
|
curprime += 2; |
01:0104 |
38 |
|
} |
01:0109 |
39 |
|
} |
|
40 |
|
|
В порядке убывания времени выполнения:
оператор взятия по модулю (68,09%)
условный оператор (15,33%)
оператор цикла (10,84%)
получение элемента массива (3,57%)
инкремент (0,04%)
Итак, основное узкое место программы - оператор взятия по модулю. Это узкое место не подлежит оптимизации, потому что необходимо для корректного выполнения алгоритма программы.