 
        
        - •_________________________
- •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%) 
Итак, основное узкое место программы - оператор взятия по модулю. Это узкое место не подлежит оптимизации, потому что необходимо для корректного выполнения алгоритма программы.
