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

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

Восстановить пароль Регистрация
 
Олег74
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 105
27.03.2014, 21:25     Среднее время выполнения команды #1
Подскажите, пожалуйста, как можно посчитать среднее время выполнения команды?

Добавлено через 16 секунд
*программы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
27.03.2014, 21:42     Среднее время выполнения команды #2
функция clock()

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

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

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

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

Добавлено через 52 секунды
А вообще, если задача не сводится только к C++, то есть профессиональный софт для измерения времени работы программ.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
28.03.2014, 08:40     Среднее время выполнения команды #3
Цитата Сообщение от НеСказочник Посмотреть сообщение
но clock() меряет очень грубо, в смысле с точностью до миллисекунд (кажется) поэтому, если участок кода очень коротки и измерения показывают ноль, то нужно запустить код в цикле.
http://www.cplusplus.com/reference/ctime/clock/
Returns the processor time consumed by the program.
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
28.03.2014, 10:30     Среднее время выполнения команды #4
Цитата Сообщение от Croessmah Посмотреть сообщение
http://www.cplusplus.com/reference/ctime/clock/
Returns the processor time consumed by the program.
Ну да. Я так и написал
Цитата Сообщение от НеСказочник Посмотреть сообщение
Функция хороша тем, что возвращает время для твоего потока
Цитата Сообщение от НеСказочник Посмотреть сообщение
Один раз перед кодом и один после. Разница и будет твоим временем.
Простите, на что вы хотели обратить моё внимание?
Redee
17 / 17 / 3
Регистрация: 04.10.2014
Сообщений: 91
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;
}
hoggy
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
27.11.2014, 02:19     Среднее время выполнения команды #6
Цитата Сообщение от Redee Посмотреть сообщение
QueryPerformanceFrequency(&freq);
На многоядерных может начать плясать.


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

std::chrono::high_resolution_clock

http://www.cplusplus.com/reference/c...ion_clock/now/
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
27.11.2014, 08:14     Среднее время выполнения команды #7
Как замерить время работы функции?
Время работы программы
Измеряем время выполнения
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2014, 18:55     Среднее время выполнения команды
Еще ссылки по теме:

C++ Ошибка во время выполнения
C++ Алгоритм выполнения команды описаный в XML
Шанс выполнения команды C++

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

Или воспользуйтесь поиском по форуму:
Redee
17 / 17 / 3
Регистрация: 04.10.2014
Сообщений: 91
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
Yandex
Объявления
30.11.2014, 18:55     Среднее время выполнения команды
Ответ Создать тему
Опции темы

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