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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Олег74
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 105
#1

Среднее время выполнения команды - C++

27.03.2014, 21:25. Просмотров 1034. Ответов 7
Метки нет (Все метки)

Подскажите, пожалуйста, как можно посчитать среднее время выполнения команды?

Добавлено через 16 секунд
*программы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2014, 21:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Среднее время выполнения команды (C++):

Шанс выполнения команды - C++
Такой вопросик , есть ли команда, или как реализовать что б было примерно так , я пишу for(i=0;i<=max;) /* вводим переменую шанса */...

Алгоритм выполнения команды описаный в XML - C++
Программа выполняет команды введенные пользователем. Необходимо сделать так что бы пользователь мог добавлять команды сам(которых еще нет в...

Вывести направление робота после выполнения полученной команды - C++
Здравствуйте! Условие задачи: Робот может перемещаться в четырех направлениях («С» — север, «З» — запад, «Ю» — юг, «В» — восток) и...

Вывести направление робота после выполнения полученной команды. - C++
Case. Робот может перемещаться в четырех направлениях («С» — север, «З» — запад, «Ю» — юг, «В» — восток) и принимать три цифровые...

Иероглифы при записи в файл результата выполнения команды system - C++
Собственно проблема возникает при наличии русских букв в результате выполнения команды system("echo 'Привет' > text.txt"). Приложение не...

Почему после выполнения команды cprintf значения строк затираются? - C++
Здраствуйте. Помогите пожалуйста, что это может быть, что вот уже больше дня играюсь с билдером и он непонятно что творит. Например,...

7
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 2
27.03.2014, 21:42 #2
функция clock()

Вызываешь дважды. Один раз перед кодом и один после. Разница и будет твоим временем. Функция хороша тем, что возвращает время для твоего потока. Так, если просто проверять системное время, то есть риск захватить и время выполнения других процессов, а тогда измерения будут бессмысленны. но clock() меряет очень грубо, в смысле с точностью до миллисекунд (кажется) поэтому, если участок кода очень коротки и измерения показывают ноль, то нужно запустить код в цикле. Просто оборачиваешь измеряемый код в цикл, что бы одно и то же повторилось много раз (порядка 1000-1000000) но тогда нужно измерить два времени:
1) Время работы кода в цикле, например 1000 повторений.
2) Время работы такого же точно цикла, но холостого, т.е. просто пустой цикл.

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

Только учти, что чтение файла, операторы printf, scanf и прочее, так же занимают время, поэтому нужно стараться измерять только тот участок кода, который тебя интересует, без лишних операторов, вроде чтения файла. Если только ты не собираешься именно чтение файла мерить.

Добавлено через 3 минуты
Когда меряешь в цикле, то вызовы clock() ставишь непосредственно сразу перед циклом и сразу после него.

Добавлено через 52 секунды
А вообще, если задача не сводится только к C++, то есть профессиональный софт для измерения времени работы программ.
0
Croessmah
Эксперт CЭксперт С++
13413 / 7564 / 855
Регистрация: 27.09.2012
Сообщений: 18,618
Записей в блоге: 3
Завершенные тесты: 1
28.03.2014, 08:40 #3
Цитата Сообщение от НеСказочник Посмотреть сообщение
но clock() меряет очень грубо, в смысле с точностью до миллисекунд (кажется) поэтому, если участок кода очень коротки и измерения показывают ноль, то нужно запустить код в цикле.
http://www.cplusplus.com/reference/ctime/clock/
Returns the processor time consumed by the program.
0
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 2
28.03.2014, 10:30 #4
Цитата Сообщение от Croessmah Посмотреть сообщение
http://www.cplusplus.com/reference/ctime/clock/
Returns the processor time consumed by the program.
Ну да. Я так и написал
Цитата Сообщение от НеСказочник Посмотреть сообщение
Функция хороша тем, что возвращает время для твоего потока
Цитата Сообщение от НеСказочник Посмотреть сообщение
Один раз перед кодом и один после. Разница и будет твоим временем.
Простите, на что вы хотели обратить моё внимание?
0
Redee
17 / 17 / 3
Регистрация: 04.10.2014
Сообщений: 92
26.11.2014, 23:43 #5
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
// Профилирование кода на C++
// за основу использовалась документация MSDN >>
// http://msdn.microsoft.com/en-us/library/windows/desktop/ee417693.aspx
// http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408.aspx
// Применимо только для измерения скорости кода
// в игровой логике использовать НЕ надо
// "Nevertheless, developers should attempt to have their games call QueryPerformanceCounter
// as little as possible to avoid any performance penalty."
 
#include "iostream"
#include "iomanip"
#include "windows.h"
#include "math.h"
using namespace std;
 
void main()
{
    // максимальная точность вывода для double
    cout << setprecision(15);
 
    // декларируем используемые переменные
    LARGE_INTEGER freq, start, end, elaps;
    double micSec;
    double sec;
    
    // частота процессора Hz в секунду
    // замеры тоже будут метками в Hz
    QueryPerformanceFrequency(&freq);
    cout << "CPU freq in Hz: " << freq.QuadPart << endl;
 
    // ставим метку
    QueryPerformanceCounter(&start);
    // проверяемый код
    int n = 1;
    int k = 2;
    ////////
    // ставим метку
    QueryPerformanceCounter(&end);
 
    // узнаем сколько Hz прошло
    elaps.QuadPart = end.QuadPart - start.QuadPart;
 
    // конвертируем в микросекунды
    // рекомендуется чтобы не терять данные
    // 1 сек = 1000 000 микросек
    micSec = 1000000 * ((double)elaps.QuadPart / (double)freq.QuadPart);
    cout << "Execution time in micSec: " << micSec << endl;
 
    
    QueryPerformanceCounter(&start);
    // проверяем следующий код
    // естественно можете написать функцию / метод для автоматизации профилирования )))
    n++;
    k++;
    QueryPerformanceCounter(&end);
    elaps.QuadPart = end.QuadPart - start.QuadPart;
    micSec = 1000000 * ((double)elaps.QuadPart / (double)freq.QuadPart);
    cout << "Execution time in micSec: " << micSec << endl;
}
0
hoggy
6646 / 2832 / 485
Регистрация: 15.11.2014
Сообщений: 6,256
Завершенные тесты: 1
27.11.2014, 02:19 #6
Цитата Сообщение от Redee Посмотреть сообщение
QueryPerformanceFrequency(&freq);
На многоядерных может начать плясать.


В наши дни есть стандартное средство, которое таких проблем не имеет:

std::chrono::high_resolution_clock

http://www.cplusplus.com/reference/c...ion_clock/now/
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,530
Завершенные тесты: 1
27.11.2014, 08:14 #7
Как замерить время работы функции?
Время работы программы
Измеряем время выполнения
0
Redee
17 / 17 / 3
Регистрация: 04.10.2014
Сообщений: 92
30.11.2014, 18:55 #8
Сейчас порыл инет и действительно встречаются ошибки при использовании QPC на многоядерных компьютерах.
И согласен если стоит win7 и visual studio 2012 и выше то применяем <chrono>.
Если среда разработки VS2010 и давнее, то выбор будет на timeGetTime().

Добавлено через 8 минут
Проблемы с QPC могут встречаться только на операционках до winXP и на некоторых многоядерных компьютерах.
http://msdn.microsoft.com/en-us/libr.../dn553408.aspx

Windows XP and Windows 2000
QPC is available on Windows XP and Windows 2000 and works well on most systems. However, some hardware systems' BIOS didn't indicate the hardware CPU characteristics correctly (a non-invariant TSC), and some multi-core or multi-processor systems used processors with TSCs that couldn't be synchronized across cores. Systems with flawed firmware that run these versions of Windows might not provide the same QPC reading on different cores if they used the TSC as the basis for QPC.
Добавлено через 1 час 52 минуты
timeGetTime() имеет меньшую точность измерения - 5милисек
В то время имея "процессор" даже с частотой 1mHz(1000000Hz) через QPC мы получаем - 1микросек точности
Соотношение 1миксек и 5000миксек говорит само за себя

Если есть возможность использовать chrono конечно же его и применять.

Здесь описывается о багах QPC на старых операционках.
http://www.virtualdub.org/blog/pivot/entry.php?id=106
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2014, 18:55
Привет! Вот еще темы с ответами:

Время выполнения - C++
Скажите, как я могу сравнить время выполнения 2 функций? Желательно сразу готовый код.

Время выполнения - C++
Я здесь в первый раз и ещё не разобралась с форумом, дико извиняюсь если что не так. Мне нужно чтобы определялось время выполнения...

С++ время работы выполнения - C++
Помогите, пожалуйста, разобраться. Нужно найти время работ двух функций, вычисляющих число ПИ (не менее 10000 итераций). По сути, это 2...

Время выполнения программы - C++
Здравствуйте.Я до сих пор новичок в программировании,сразу скажу,и тонкостей не знаю. Собрал я тут программу с использованием CUDA.И...


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
30.11.2014, 18:55
Ответ Создать тему
Опции темы

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