Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №21.doc
Скачиваний:
17
Добавлен:
01.05.2014
Размер:
1.02 Mб
Скачать

Министерство Образования Российской Федерации

Санкт-Петербургский Государственный Электротехнический Университет «ЛЭТИ»

_________________________

кафедра МО ЭВМ

Отчет

по лабораторной работе №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%)

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