Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/182: Рейтинг темы: голосов - 182, средняя оценка - 4.92
12 / 12 / 3
Регистрация: 09.05.2010
Сообщений: 384

Как замерить длительность выполнения кода?

04.02.2012, 00:28. Показов 37930. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно замерить длительность выполнения кода. Как?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.02.2012, 00:28
Ответы с готовыми решениями:

Как с точностью до микросекунд замерить время выполнения функции?
Товарищи, подскажите, как с точностью до микросекунд замерить время выполнения некоторой функции?

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

Замерить скорость выполнения алгоритма
Как в Pascal ABC измерить скорость выполнения всего кода либо отдельного участка?

18
 Аватар для Serejke_qq
199 / 142 / 57
Регистрация: 06.07.2011
Сообщений: 300
04.02.2012, 00:29
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main()
{
    clock_t start, end;
 
    start = clock();
 
    /* Код, который время выполнения которого нужно измерить */
    /*  */
    
    end = clock();
 
    printf("The above code block was executed in %.4f second(s)\n", ((double) end - start) / ((double) CLOCKS_PER_SEC));
    
    return 0;
}
(копипаста..)
еденицы: секунды + милисекунды.. 0.0000
3
12 / 12 / 3
Регистрация: 09.05.2010
Сообщений: 384
04.02.2012, 00:33  [ТС]
Serejke_qq, а в каких единицах измеряется?
0
Эксперт Pascal/Delphi
 Аватар для xxbesoxx
1135 / 616 / 129
Регистрация: 13.02.2009
Сообщений: 3,600
04.02.2012, 00:38
не понял подробно пожалуйста
0
 Аватар для Serejke_qq
199 / 142 / 57
Регистрация: 06.07.2011
Сообщений: 300
04.02.2012, 00:59
Цитата Сообщение от xxbesoxx Посмотреть сообщение
не понял подробно пожалуйста
м?) выше приведенный код замеряет время выполнения участка кода..
например этот не очень красивый код:
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
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void sort(int * arr, int n);
void show(int * arr, int n);
 
int main()
{
    clock_t start, end;
 
    int n;
    int * arr;
 
    scanf("%d",&n);                             // Ввод размера массива
 
    arr = (int *)malloc(n * sizeof(int));       // Выделяем память под элементы
    
    srand(time(NULL));
 
    for(int i=0; i<n; i++)                      // Рандомный ввод массива
        arr[i] = rand()%50;
 
    show(arr,n);
 
    printf("\n---------------------\n");
 
    start = clock();
    
    sort(arr,n);                                // Замеряем данный кусок (сортировка)
 
    end = clock();
 
    show(arr,n);  
 
    printf("\nThe above code block was executed in %.4f second(s)\n", ((double) end - start) / ((double) CLOCKS_PER_SEC));
 
    free(arr);    // Чистим память
 
    return 0;
}
 
// ---------------------------------- //
 
void show(int *arr, int n)
{
    for(int i=0; i<n; i++)
        printf("%d ",arr[i]);
}
 
void sort(int * arr, int n)
{
    int temp;
    for(int j=0; j<n; j++)
        for(int i=0; i<n; i++)
        {
            if(arr[i] > arr[i+1])
            {
                temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
}
Данный код измеряет время выполнения сортировки методом пузырька..
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
04.02.2012, 17:23
Цитата Сообщение от AKE Посмотреть сообщение
а в каких единицах измеряется?
- clock возвращает число тиков(процессора) чтобы перевести в секунды значение возвращённое clock нужно поделить на CLOCKS_PER_SEC
тут и примерчик есть:
http://www.cplusplus.com/refer... ime/clock/

Добавлено через 43 секунды
Цитата Сообщение от Serejke_qq Посмотреть сообщение
(double) end - start) / ((double) CLOCKS_PER_SEC));
- вот оно деление на CLOCKS_PER_SEC - число тиков процессора в секунду(читай его тактовая частота)
1
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.02.2012, 19:46
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <boost/chrono.hpp>
 
int main()
{
    boost::chrono::system_clock::time_point start = boost::chrono::system_clock::now();
    
    for (int i = 0; i < 1e8; ++i)
        ;
    
    boost::chrono::duration<double> duration = boost::chrono::system_clock::now() - start;
    std::cout << std::fixed << duration << std::endl;
}
2
0 / 0 / 0
Регистрация: 18.07.2024
Сообщений: 3
18.07.2024, 17:20
clock возвращает число тиков(процессора)
Нет - она возвращает миллисекунды.
Измерение действительно происходит по команде rdtscp, т.е. в условных тактах процессора, но потом они округляются до мс.
А CLOCKS_PER_SEC просто = 1000 и не зависит от тактовой частоты процессора.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
18.07.2024, 17:27
Цитата Сообщение от y_mur Посмотреть сообщение
Нет - она возвращает миллисекунды.
Нет, она не возвращает ни никакие "миллисекунды", ни никакие "тики процессора". Она возвращает абстрактные условные единицы, которые могут быть пересчитанв в секунды через CLOCKS_PER_SEC.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6210 / 2907 / 1044
Регистрация: 01.06.2021
Сообщений: 10,729
18.07.2024, 17:55
Ладно, я тоже отвечу на этот некропост.

Во-первых, Serejke_qq выложил код, написанный на языке С, а не С++.

Во-вторых, читаем документацию

clock_t clock(void);

Returns the approximate processor time used by the process since the beginning of an implementation-defined era related to the program's execution. To convert result value to seconds, divide it by CLOCKS_PER_SEC.

В-третьих, я бы не использовал процессорное время для
Цитата Сообщение от AKE Посмотреть сообщение
Как замерить длительность выполнения кода?
Условию больше соответствует wall time, а не cpu time, поскольку когда человек имеет в виду время выполнения кода, то подразумевает реальное время. Поэтому советую использовать std::chrono::high_resolution_clock, если на вашей системе std::chrono::high_resolution_clock::is_steady выдает true, иначе юзать std::chrono::steady_clock
0
 Аватар для Наталья8
520 / 374 / 66
Регистрация: 09.03.2016
Сообщений: 3,987
18.07.2024, 18:51
Когда то я был этим озабочен...

Добавлено через 2 минуты
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
31
32
33
 #include <iostream>
__int64 TimerInit()
{
__int64 init_counter;
QueryPerformanceCounter((LARGE_INTEGER*)&init_counter);
return init_counter;
}
double TimerDiff(__int64 init_counter)
{
__int64 freq, diff_counter;
QueryPerformanceFrequency((LARGE_INTEGER*)&freq); // кол-во тиков в секунду
QueryPerformanceCounter((LARGE_INTEGER*)&diff_counter);
return (diff_counter-init_counter) * 1000.0 / freq;
}
//----------------------------
int _tmain(int argc, _TCHAR* argv[])
{
for(int i=0;i<8;i++){
    __int64 Start = TimerInit(); // запускаем секундомер
 
Sleep(50);//============ Сюда вставлять измеряемый код....
      double end = TimerDiff(Start);
std::cout<< end <<  std::endl;}
getch();
    return 0;
}
/*
QueryPerformanceCounter считывает регистр счетчика циклов, специфичный для ядра,
 и, если поток выполнения был перенесен на другое ядро,
 два измерения из QueryPerformanceCounter включают не только прошедшее время,
 но часто фиксированную, большую и трудную для определения дельты между двумя регистрами ядер.
 Так что - это работает надежно, как представлено,
 если ваш процесс связан с конкретным ядром. -  Тони Делрой  */
Добавлено через 3 минуты
Вроде попроще....
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
 #include <ratio>
              #include <chrono>
//using namespace std;
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    using namespace std::chrono;
    while (1){
        high_resolution_clock::time_point t1 = high_resolution_clock::now();
                
for (int i = 0; i < 10000; ++i) std::cout << "*";
        std::cout << std::endl;
 
        high_resolution_clock::time_point t2 = high_resolution_clock::now();
 
        duration<double>time_span = duration_cast<duration<double>>(t2 - t1);
 
        std::cout << "It took me: " << time_span.count() << " seconds.";
        std::cout << std::endl;
    std::cout << "printing out 10000 stars...\n"; Sleep(500);
             }
    return 0;
}
Вывести по человечески время...

C++
1
2
3
4
char s[25]{};// туда же
sprintf(s, "%02d:%02d%s%d%s", (seconde % 3600) / 60, seconde % 60, " -- ", NULL, " fr/s.");// часы ( таймер)                                 #
            //----------------------------------------------------                                                         #
    std::cout << " " << s << "(" << NULL<< " sample)\r";
Добавлено через 12 минут
Надеюсь не выдал никаких секретов...
0
0 / 0 / 0
Регистрация: 18.07.2024
Сообщений: 3
19.07.2024, 11:57
Цитата Сообщение от TheCalligrapher
Она возвращает абстрактные условные единицы, которые могут быть пересчитаны в секунды через CLOCKS_PER_SEC.
Достаточно заглянуть в определение CLOCKS_PER_SEC, чтобы увидеть что это жёстко забитая константа = 1000.
И никаких там хитрых абстракций
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
19.07.2024, 12:00
Цитата Сообщение от y_mur Посмотреть сообщение
Достаточно
Открыть CLOCKS_PER_SEC
и видим что
#define CLOCKS_PER_SEC /*implementation defined*/
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6210 / 2907 / 1044
Регистрация: 01.06.2021
Сообщений: 10,729
19.07.2024, 12:04
Цитата Сообщение от y_mur Посмотреть сообщение
жёстко забитая константа = 1000
добавлю к сказанному SmallEvil, что на линуксе там миллион))
0
0 / 0 / 0
Регистрация: 18.07.2024
Сообщений: 3
19.07.2024, 12:06
Цитата Сообщение от Royal_X
Поэтому советую использовать std::chrono::high_resolution_clock,
Да я тоже наигравшись с rdtsc, QueryPerformance, clock() остановился на std::chrono::high_resolution_clock потому что там удобно выбирать единицы измерения и если выбрать например микросекунды, то они не будут округлены до миллисекунд как в clock().
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6210 / 2907 / 1044
Регистрация: 01.06.2021
Сообщений: 10,729
19.07.2024, 12:34
Цитата Сообщение от y_mur Посмотреть сообщение
там удобно выбирать единицы измерения и если выбрать например микросекунды
только сперва проверь разрешение твоего таймера /системных часов. Если он не такой точный, то нет смысла лезть в малые единицы.

например, у моего HPET 100 наносекунд
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
19.07.2024, 13:01
Цитата Сообщение от y_mur Посмотреть сообщение
Достаточно заглянуть в определение CLOCKS_PER_SEC, чтобы увидеть что это жёстко забитая константа = 1000.
И никаких там хитрых абстракций
Ну, давай, посмотрим-с
https://github.com/lattera/gli... its/time.h
C
1
2
3
4
5
6
7
/* ISO/IEC 9899:1999 7.23.1: Components of time
   The macro `CLOCKS_PER_SEC' is an expression with type `clock_t' that is
   the number per second of the value returned by the `clock' function.  */
/* CAE XSH, Issue 4, Version 2: <time.h>
   The value of CLOCKS_PER_SEC is required to be 1 million on all
   XSI-conformant systems. */
#define CLOCKS_PER_SEC  ((__clock_t) 1000000)
Вопрос о жестко забитой тысяче закрыт?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
19.07.2024, 19:24
Цитата Сообщение от y_mur Посмотреть сообщение
Достаточно заглянуть в определение CLOCKS_PER_SEC, чтобы увидеть что это жёстко забитая константа = 1000.
Что за дикую чушь вы несете?

Определение CLOCKS_PER_SEC находится в разделе 7.27 стандарта языка С. Первое, что бросается в глаза, это то, что в описании нет слов "integer constant", то есть никакая это не константа. Понятно, что о какой-то померещившейся вам "1000" речи быть не может...
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,279
19.07.2024, 21:37
Разрешить ваш спор очень просто. Выведите на экран значения (double) end - start) и (double) end - start) / ((double) CLOCKS_PER_SEC).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.07.2024, 21:37
Помогаю со студенческими работами здесь

Замерить время выполнения потока
Здравствуйте, нужно узнать за сколько времени выполнится поток? При последовательном исполнении программы я нашел способ как измерить...

Замерить время выполнения базовых операций
собственно, нужно замерить время выполнени +-*/ для всех типов. делал следующим образом double empty = 0; Stopwatch...

Длительность выполнения одной операции в минутах, Сколько операций можно выполнить за указанное время
Написать программу: Длительность выполнения одной операции в минутах, Сколько операций можно выполнить за указанное время Заранее...

Задержка выполнения кода на время выполнения анимации
Пишу игру с видом пошагового боя. С каждым ходом, игрок выкладывает на доску новую фигуру. После того, как игрок выложил фигуру –...

Как узнать время выполнения кода?
Без помощи GetTime


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru