С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 14.11.2014
Сообщений: 11
1

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

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

Author24 — интернет-сервис помощи студентам
Сразу скажу что меня не интересуют стандартные замеры времени роботы участка кода, так как они показывают время роботы данного участка кода + время роботы других процессов (до момента завершения участка кода) -- это я говорю исходя из роботы планировщиков задач (если я не прав прошу поправте меня).
Вопрос состоит в следующем, как замереть время роботы только данного процесса (определенный участок кода) и возможно ли это вообще ?
P.s.: Нашел способ дать процессу высший приоритет но все же наверняка он с таким приоритетом будет не один, по тому и ищу другие способы. С уважением, ваш покорный новичок.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Блог
27.03.2016, 23:46
Ответы с готовыми решениями:

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

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

Замер времени выполнения программного кода
Как замерить время выполнения этого программного кода (в секундах) и вывести его на экран? Как...

Замер времени работы функции через clock()
Имеется некая функция, требуется замерить время её выполнения. Накидал такой код : #include...

6
Почетный модератор
Эксперт С++
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
28.03.2016, 15:32 2
Тут надо копать уже в сторону операционной системы (пытаться выполнить код до загрузки системы, чтобы она не отжирала ресурсы), либо устройства процессора. Потому как что считать временем работы кода непонятно. Сколько тиков процессора ушло на выполнение данного кода и это число умножить на частоту? Или еще подсчитать количество обращений к памяти и умножить на частоту шины?
Время работы кода и есть время, за которое он отработает на конкретной машине.
Может быть Убежденный что-нибудь сможет подсказать.
0
19 / 19 / 14
Регистрация: 21.03.2016
Сообщений: 60
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
0 / 0 / 0
Регистрация: 14.11.2014
Сообщений: 11
30.03.2016, 23:12  [ТС] 4
Спасибо за ответ.
0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
31.03.2016, 02:22 5
Цитата Сообщение от dreko Посмотреть сообщение
это я говорю исходя из роботы планировщиков задач (если я не прав прошу поправте меня).
Это всё сильно зависит от а). операционной системы и б). от выбранной дисциплины планирования (если в этой системе еёможно менять).
Для дисциплин планирования так называемых "реального времени" (FIFO, RR, sporadic, adaptive) процесс с несколько завышенным приоритетом вообще никогда не будет вытесняться.

Та что выполнение участка кода с достаточной достоверностью можно выполнять по "зарубкам" времени начала и конца. А для высокой точности есть независимый счётчик тактов процессорной частоты и ассемблерная инструкция RDTSC для считывания числа тактов с момента рестарта процессора (можно измерять временные интервалы в наносекундном диапазоне).
0
Вездепух
Эксперт CЭксперт С++
12798 / 6674 / 1796
Регистрация: 18.10.2014
Сообщений: 16,894
02.04.2016, 23:50 6
Цитата Сообщение от SolidCoder Посмотреть сообщение
Берешь дизассемблированный листинг, идешь и смотришь количество тактов процессора и умножаешь на его частоту.
Вы шутите? На современной архитектуре c конвейерным выполением инструкций и с out-of-order выполнением сидеть и складывать такты из справочника - занятие соврешенно бессмысленное. И это не говоря уже о том, что производлительность вашего кода будет сильно зависеть от его работы с процессорным кэшем и от успешности предсказания условных переходов.
0
128 / 126 / 60
Регистрация: 22.01.2014
Сообщений: 464
04.04.2016, 22:39 7
Почитал я тут ответы, может я чего-то не понял.
Может профилирование надо? Не, не подходит?
Профилирование служит как для определения затрат времени на разных участках хода.
А также для определения какие функции вообще не используется в работе программы.
Для чтобы использовать профилирование, необходимо собрать приложение особым образом( В GCC используется опция -pg ).
И особым образом запустить, а потом можно будет исследовать сгенерированый отчет.
Даю пару ссылок:
http://www.ibm.com/developerwo... l-gnuprof/
http://ccfit.nsu.ru/arom/data/... ng_txt.pdf
0
04.04.2016, 22:39
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
04.04.2016, 22:39
Помогаю со студенческими работами здесь

Можно ли измерить время работы участка кода в тактах процессора?
Если да, то подскажите способ. Важно что бы при измерениях не мерились службы и процессы винды и...

Замер времени
Работает через раз. #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;time.h&gt; #include...

Измерение времени работы кода
Нужно подсчитать время выполнения кода. данный отрывок сортирует массив. если размер массива...

Осуществить замер времени for и while
Здравствуйте! Условие задачи: Написать программу выводящее на экран любое текстовое сообщение...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru