Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
dreko
0 / 0 / 0
Регистрация: 14.11.2014
Сообщений: 7
#1

Замер времени работы участка кода - C++

27.03.2016, 23:46. Просмотров 389. Ответов 6
Метки нет (Все метки)

Сразу скажу что меня не интересуют стандартные замеры времени роботы участка кода, так как они показывают время роботы данного участка кода + время роботы других процессов (до момента завершения участка кода) -- это я говорю исходя из роботы планировщиков задач (если я не прав прошу поправте меня).
Вопрос состоит в следующем, как замереть время роботы только данного процесса (определенный участок кода) и возможно ли это вообще ?
P.s.: Нашел способ дать процессу высший приоритет но все же наверняка он с таким приоритетом будет не один, по тому и ищу другие способы. С уважением, ваш покорный новичок.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
5588 / 2622 / 239
Регистрация: 01.11.2011
Сообщений: 6,448
Завершенные тесты: 1
28.03.2016, 15:32     Замер времени работы участка кода #2
Тут надо копать уже в сторону операционной системы (пытаться выполнить код до загрузки системы, чтобы она не отжирала ресурсы), либо устройства процессора. Потому как что считать временем работы кода непонятно. Сколько тиков процессора ушло на выполнение данного кода и это число умножить на частоту? Или еще подсчитать количество обращений к памяти и умножить на частоту шины?
Время работы кода и есть время, за которое он отработает на конкретной машине.
Может быть Убежденный что-нибудь сможет подсказать.
SolidCoder
19 / 19 / 8
Регистрация: 21.03.2016
Сообщений: 60
Завершенные тесты: 2
29.03.2016, 20:27     Замер времени работы участка кода #3
Чет не понял, в чем загвостка.

Если под "стандартными методами" не подразумевается вызов GetTickCount:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <windows.h>
#include <algorithm>
 
using namespace std;
 
 
void function()
{
    int *n = new int[1024];
    for (int i = 0; i < 1024; i++)
        n[i] = i*i;
    sort(n, n + 1024);
    for (int i = 0; i < 1023; i++)
    {
        n[i] = n[i] * n[i + 1];
    }
    delete[]n;
}
 
int main()
{
    DWORD start = GetTickCount();
    for (int i = 0; i < 1000; i++)
    function();
    DWORD end = GetTickCount();
    cout << (unsigned int)(end - start) << endl;
    cin.get();
    return 0;
}
У меня на системе 46 мс. Следовательно function выполняется за 46 мкс.

Если меньше 1 мс, то разность GetTickCount дает 0. Поэтому, лично я, использую циклы, когда надо замерить скорость быстро выполняющегося блока.


Если GetTickCount не подходит, то есть специальная инструкция процессоров Intel rdtsc

Добавлено через 11 минут
UPD: Соррян, я понял, загвостка в том, что система забирает процессорное время.

Берешь дизассемблированный листинг, идешь и смотришь количество тактов процессора и умножаешь на его частоту.

Пример для кода Выше.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
.text:00402970 sub_402970      proc near               ; CODE XREF: sub_402A30+2Ap
.text:00402970
.text:00402970 var_14          = dword ptr -14h
.text:00402970 var_10          = dword ptr -10h
.text:00402970 var_C           = dword ptr -0Ch
.text:00402970 var_8           = dword ptr -8
.text:00402970 var_4           = dword ptr -4
.text:00402970
.text:00402970                 push    ebp
.text:00402971                 mov     ebp, esp
.text:00402973                 sub     esp, 14h
.text:00402976                 push    esi
.text:00402977                 push    1000h
.text:0040297C                 call    sub_408E9F
.text:00402981                 add     esp, 4
.text:00402984                 mov     [ebp+var_10], eax
.text:00402987                 mov     eax, [ebp+var_10]
.text:0040298A                 mov     [ebp+var_4], eax
.text:0040298D                 mov     [ebp+var_8], 0
.text:00402994                 jmp     short loc_40299F
.text:00402996 ; ---------------------------------------------------------------------------
.text:00402996
.text:00402996 loc_402996:                             ; CODE XREF: sub_402970+48j
.text:00402996                 mov     ecx, [ebp+var_8]
.text:00402999                 add     ecx, 1
.text:0040299C                 mov     [ebp+var_8], ecx
.text:0040299F
.text:0040299F loc_40299F:                             ; CODE XREF: sub_402970+24j
.text:0040299F                 cmp     [ebp+var_8], 400h
.text:004029A6                 jge     short loc_4029BA
.text:004029A8                 mov     edx, [ebp+var_8]
.text:004029AB                 imul    edx, [ebp+var_8]
.text:004029AF                 mov     eax, [ebp+var_8]
.text:004029B2                 mov     ecx, [ebp+var_4]
.text:004029B5                 mov     [ecx+eax*4], edx
.text:004029B8                 jmp     short loc_402996
.text:004029BA ; ---------------------------------------------------------------------------
.text:004029BA
.text:004029BA loc_4029BA:                             ; CODE XREF: sub_402970+36j
.text:004029BA                 mov     edx, [ebp+var_4]
.text:004029BD                 add     edx, 1000h
.text:004029C3                 push    edx
.text:004029C4                 mov     eax, [ebp+var_4]
.text:004029C7                 push    eax
.text:004029C8                 call    sub_4061D0
.text:004029CD                 add     esp, 8
.text:004029D0                 mov     [ebp+var_C], 0
.text:004029D7                 jmp     short loc_4029E2
.text:004029D9 ; ---------------------------------------------------------------------------
.text:004029D9
.text:004029D9 loc_4029D9:                             ; CODE XREF: sub_402970+98j
.text:004029D9                 mov     ecx, [ebp+var_C]
.text:004029DC                 add     ecx, 1
.text:004029DF                 mov     [ebp+var_C], ecx
.text:004029E2
.text:004029E2 loc_4029E2:                             ; CODE XREF: sub_402970+67j
.text:004029E2                 cmp     [ebp+var_C], 3FFh
.text:004029E9                 jge     short loc_402A0A
.text:004029EB                 mov     edx, [ebp+var_C]
.text:004029EE                 mov     eax, [ebp+var_4]
.text:004029F1                 mov     ecx, [ebp+var_C]
.text:004029F4                 mov     esi, [ebp+var_4]
.text:004029F7                 mov     edx, [eax+edx*4]
.text:004029FA                 imul    edx, [esi+ecx*4+4]
.text:004029FF                 mov     eax, [ebp+var_C]
.text:00402A02                 mov     ecx, [ebp+var_4]
.text:00402A05                 mov     [ecx+eax*4], edx
.text:00402A08                 jmp     short loc_4029D9
.text:00402A0A ; ---------------------------------------------------------------------------
.text:00402A0A
.text:00402A0A loc_402A0A:                             ; CODE XREF: sub_402970+79j
.text:00402A0A                 mov     edx, [ebp+var_4]
.text:00402A0D                 mov     [ebp+var_14], edx
.text:00402A10                 mov     eax, [ebp+var_14]
.text:00402A13                 push    eax             ; void *
.text:00402A14                 call    j_j__free
.text:00402A19                 add     esp, 4
.text:00402A1C                 pop     esi
.text:00402A1D                 mov     esp, ebp
.text:00402A1F                 pop     ebp
.text:00402A20                 retn
.text:00402A20 sub_402970      endp
А вот как посчитать количество тактов: http://www.wasm.ru/forum/viewtopic.php?id=8840

А так это слишком обширное понятие. Смысл считать скорость выполнения кода теоретическую, если на реальной машине это все будет зависит от огромного количества факторов?

Для этого существует оценка сложности алгоритмов
dreko
0 / 0 / 0
Регистрация: 14.11.2014
Сообщений: 7
30.03.2016, 23:12  [ТС]     Замер времени работы участка кода #4
Спасибо за ответ.
Olej
123 / 117 / 13
Регистрация: 25.03.2012
Сообщений: 456
31.03.2016, 02:22     Замер времени работы участка кода #5
Цитата Сообщение от dreko Посмотреть сообщение
это я говорю исходя из роботы планировщиков задач (если я не прав прошу поправте меня).
Это всё сильно зависит от а). операционной системы и б). от выбранной дисциплины планирования (если в этой системе еёможно менять).
Для дисциплин планирования так называемых "реального времени" (FIFO, RR, sporadic, adaptive) процесс с несколько завышенным приоритетом вообще никогда не будет вытесняться.

Та что выполнение участка кода с достаточной достоверностью можно выполнять по "зарубкам" времени начала и конца. А для высокой точности есть независимый счётчик тактов процессорной частоты и ассемблерная инструкция RDTSC для считывания числа тактов с момента рестарта процессора (можно измерять временные интервалы в наносекундном диапазоне).
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3608 / 1883 / 500
Регистрация: 18.10.2014
Сообщений: 3,441
02.04.2016, 23:50     Замер времени работы участка кода #6
Цитата Сообщение от SolidCoder Посмотреть сообщение
Берешь дизассемблированный листинг, идешь и смотришь количество тактов процессора и умножаешь на его частоту.
Вы шутите? На современной архитектуре c конвейерным выполением инструкций и с out-of-order выполнением сидеть и складывать такты из справочника - занятие соврешенно бессмысленное. И это не говоря уже о том, что производлительность вашего кода будет сильно зависеть от его работы с процессорным кэшем и от успешности предсказания условных переходов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2016, 22:39     Замер времени работы участка кода
Еще ссылки по теме:

C++ Замер времени выполнения программного кода
Измерение времени работы кода C++
Замер выполнения отрезка кода в микросекундах C++
C++ Замер времени работы функции через clock()
C++ Осуществить замер времени for и while

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
nikolay1982
92 / 92 / 38
Регистрация: 22.01.2014
Сообщений: 310
04.04.2016, 22:39     Замер времени работы участка кода #7
Почитал я тут ответы, может я чего-то не понял.
Может профилирование надо? Не, не подходит?
Профилирование служит как для определения затрат времени на разных участках хода.
А также для определения какие функции вообще не используется в работе программы.
Для чтобы использовать профилирование, необходимо собрать приложение особым образом( В GCC используется опция -pg ).
И особым образом запустить, а потом можно будет исследовать сгенерированый отчет.
Даю пару ссылок:
http://www.ibm.com/developerworks/ru/library/l-gnuprof/
http://ccfit.nsu.ru/arom/data/PP_ICa...filing_txt.pdf
Yandex
Объявления
04.04.2016, 22:39     Замер времени работы участка кода
Ответ Создать тему
Опции темы

Текущее время: 09:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru