Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

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

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

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

Сразу скажу что меня не интересуют стандартные замеры времени роботы участка кода, так как они показывают время роботы данного участка кода + время роботы других процессов (до момента завершения участка кода) -- это я говорю исходя из роботы планировщиков задач (если я не прав прошу поправте меня).
Вопрос состоит в следующем, как замереть время роботы только данного процесса (определенный участок кода) и возможно ли это вообще ?
P.s.: Нашел способ дать процессу высший приоритет но все же наверняка он с таким приоритетом будет не один, по тому и ищу другие способы. С уважением, ваш покорный новичок.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2016, 23:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Замер времени работы участка кода (C++):

Методы защиты данных от записи во время выполнения участка кода? - C++
День добрый, форумчане. Вводные данные: - Весь свой код строю на работе с указателями. - Потоки пока не использую - Linux, gcc...

Время выполнения участка кода - C++ Builder
как можно засечь за сколько выполняется (секунды, миллисекунды) участок кода?

ограничение времени работы программы - C++ Builder
Есть прога, как сделать, чтоб по истечении 100 дней после первого запуска на компьютере, прога не запускалась, выдавая какое-нить сообщение?

Запись кода во время работы программы - C++ Builder
Возможно ли записать код из, Memo, например, на другую форму? Т.е. запустить программу, написать код в окне и при нажатии на кнопку...

Программный пакет локализации критических по производительности работы участков кода - C++ Builder
Программный пакет локализации критических по производительности работы участков кода в программе написанной на языке программирования С++. ...

Программа с ограничением времени работы - Visual C++
Друзья!!! Помогите новичку. В общем задача в создании программы, работающей заданное число дней с момента своего первого запуска. Программа...

6
SatanaXIII
Супер-модератор
Эксперт С++
5619 / 2654 / 247
Регистрация: 01.11.2011
Сообщений: 6,552
Завершенные тесты: 1
28.03.2016, 15:32 #2
Тут надо копать уже в сторону операционной системы (пытаться выполнить код до загрузки системы, чтобы она не отжирала ресурсы), либо устройства процессора. Потому как что считать временем работы кода непонятно. Сколько тиков процессора ушло на выполнение данного кода и это число умножить на частоту? Или еще подсчитать количество обращений к памяти и умножить на частоту шины?
Время работы кода и есть время, за которое он отработает на конкретной машине.
Может быть Убежденный что-нибудь сможет подсказать.
0
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

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

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

Та что выполнение участка кода с достаточной достоверностью можно выполнять по "зарубкам" времени начала и конца. А для высокой точности есть независимый счётчик тактов процессорной частоты и ассемблерная инструкция RDTSC для считывания числа тактов с момента рестарта процессора (можно измерять временные интервалы в наносекундном диапазоне).
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3945 / 2169 / 553
Регистрация: 18.10.2014
Сообщений: 3,783
02.04.2016, 23:50 #6
Цитата Сообщение от SolidCoder Посмотреть сообщение
Берешь дизассемблированный листинг, идешь и смотришь количество тактов процессора и умножаешь на его частоту.
Вы шутите? На современной архитектуре c конвейерным выполением инструкций и с out-of-order выполнением сидеть и складывать такты из справочника - занятие соврешенно бессмысленное. И это не говоря уже о том, что производлительность вашего кода будет сильно зависеть от его работы с процессорным кэшем и от успешности предсказания условных переходов.
0
nikolay1982
117 / 117 / 43
Регистрация: 22.01.2014
Сообщений: 375
04.04.2016, 22:39 #7
Почитал я тут ответы, может я чего-то не понял.
Может профилирование надо? Не, не подходит?
Профилирование служит как для определения затрат времени на разных участках хода.
А также для определения какие функции вообще не используется в работе программы.
Для чтобы использовать профилирование, необходимо собрать приложение особым образом( В GCC используется опция -pg ).
И особым образом запустить, а потом можно будет исследовать сгенерированый отчет.
Даю пару ссылок:
http://www.ibm.com/developerworks/ru/library/l-gnuprof/
http://ccfit.nsu.ru/arom/data/PP_ICaG/06_Profiling_txt.pdf
0
04.04.2016, 22:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2016, 22:39
Привет! Вот еще темы с ответами:

Разработать класс CTime для работы со значениями времени - Visual C++
Здравствуйте! мое задание: Класс должен содержать следующие элементы. Поля (скрытые): одно единственное поле, соответствующее...

Скорость работы кода, скомпилированного в разных IDE - Visual C++
Утро дорое, форум!! Вот какое дело. Я компилировал один и тот же код, сначала на Windows XP, с помощью Borland Builder 6, потом на...

Замер скорости выполнения участка кода - C++ Linux
Нужно замерить скорость выполнения кода в рабочем проекте. Проблема дополняется тем что код нельзя вызвать несколько раз подряд, т.к....

Оптимизация кода. Замер времени выполнения части кода. - Delphi
Доброе утро. Есть желание посмотреть сколько времени занимает выполнение какого-то блока кода/отдельной функции или процедуры/программы...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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