148 / 118 / 37
Регистрация: 27.10.2011
Сообщений: 690
1

Замер времени работы функции через clock()

18.09.2015, 20:24. Показов 9778. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется некая функция, требуется замерить время её выполнения. Накидал такой код :

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
#include <iostream>
#include <stdint.h>
#include <time.h>
#include "compile_options.h"
 
double getPi(const uint64_t mCount)
{
    double result = 0;
 
    for (uint64_t i = 0; i < mCount; i++)
    {
        result += (static_cast<double>(i % 2 == 0 ? 1 : -1)) / (static_cast<double>(2 * i + 1));
    }
 
    return result * 4;
}
 
int main(int argc, char *argv[])
{
    uint64_t n;
    double pi;
    clock_t start, finish;
    
    if (argc < 2)
    {
        std::cout << "not enough parameters\n";
        return 0;
    }
 
    n = atoll(argv[1]);
 
#if COMPILE_OPTION == MEASURE_EXECUTION_TIME
    start = clock();
    pi = getPi(n);
    finish = clock();
 
    std::cout << "execution time : " << (static_cast<double>(finish - start)) / CLOCKS_PER_SEC << '\n';
#else
    pi = getPi(n);
#endif
 
    std::cout << "pi : " << pi << '\n';
}
Время всегда пишет 0. Проблема в том, что видимо вычисления распараллеливаются. Это можно заметить, запустив скомпиленный exe-шник с достаточно большим входным параметром : сначала выводится "execution time : 0", затем идёт простой программы (видно, что происходит вычисление функции), затем выводится "pi : ..." (пруф во вложении). Возможно, это не из-за распараллеливания, но тогда я не знаю причин такого поведения.
Как решить проблему?
Миниатюры
Замер времени работы функции через clock()  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2015, 20:24
Ответы с готовыми решениями:

Замер времени выполнения функции на ядре
Здравствуйте! Не могу понять почему не считает время выполнения алгоритма на ядре какие бы я...

Измерение времени исполнения алгоритма через Clock() периодически равно 0
Здравствуйте! Я в отчаянии :( Была программа на C# и появилась необходимость перевести ее на С++....

Замер времени работы участка кода
Сразу скажу что меня не интересуют стандартные замеры времени роботы участка кода, так как они...

Замер времени работы алгоритма подскажите
как реализовать на C? я делал по методу: clock_t start,end; start=clock(); //алгоритм ...

10
7786 / 6554 / 2983
Регистрация: 14.04.2014
Сообщений: 28,627
18.09.2015, 21:30 2
start и finish выведи вместе с execution time. Они отличаются?
0
2 / 2 / 1
Регистрация: 17.09.2015
Сообщений: 10
18.09.2015, 22:46 3
Можно в сторону QueryPerformanceCounter посмотреть.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.09.2015, 22:48 4
http://rextester.com/VWYA40577

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
#include <iostream>
#include <cstdint>
#include <chrono>
#include <thread>
 
 
typedef uint64_t    
    MicroSeconds;
 
// вернет промежуток времени в микросекундах
// с момента последнего запуска этого же метода
MicroSeconds QuantMS()
{
    typedef std::chrono::microseconds 
        MSec;
    typedef std::chrono::high_resolution_clock
        Clock;
 
    static Clock::time_point last;
    
    const Clock::time_point now 
        = Clock::now();
    
    const auto result 
        = std::chrono::duration_cast<MSec>(now - last);
 
    last = now;
    
    return static_cast<MicroSeconds>(result.count());
}
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    // --- засекаем время в микросекундах
    QuantMS();
    
    //--- усыпляем поток на 1 секунду, что равняется 1000000 микросекунд
    // здесь мог бы быть ваш цикл, 
    // или запуск функции время выполнения которой необходимо измерить
    std::this_thread::sleep_for(std::chrono::microseconds(1000000) );
    
    //--- засекаем, сколько времени прошло с момента предыдущего вызова этого же метода
    //(поток должен спать приблизительно 1 секунду)
    const auto elapsed = QuantMS();
    
    std::cout<<"время сна потока: "
        << elapsed<< " микросекунд, или " 
        << elapsed/1000000.0 
        << " секунд\n";
    
}
0
43 / 43 / 21
Регистрация: 24.08.2015
Сообщений: 136
18.09.2015, 23:20 5
Nikitko_Cent, Выполнил твою программу при n=10000000
execution time : 0.615
Цикл выполняется на малых n очень быстро и незаметно изменение времени.
0
148 / 118 / 37
Регистрация: 27.10.2011
Сообщений: 690
19.09.2015, 00:51  [ТС] 6
Цитата Сообщение от zealot01 Посмотреть сообщение
Nikitko_Cent, Выполнил твою программу при n=10000000
execution time : 0.615
Цикл выполняется на малых n очень быстро и незаметно изменение времени.
У меня проблема в другом :
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
сначала выводится "execution time : 0", затем идёт простой программы (видно, что происходит вычисление функции), затем выводится "pi : ..."
Т.е. сначало происходит вывод строки "execution time", а затем уже вызывается функция getPi (либо они выполняются параллельно).
0
43 / 43 / 21
Регистрация: 24.08.2015
Сообщений: 136
19.09.2015, 10:26 7
Nikitko_Cent, отключи оптимизацию. В MS Visual Studio свойства проекта,С++,Оптимизация,Оптимизация, Отключено (/Od)
0
7786 / 6554 / 2983
Регистрация: 14.04.2014
Сообщений: 28,627
19.09.2015, 11:42 8
zealot01, оптимизация может переставлять местами строки программы? Тогда бы все алгоритмы работали не верно.
0
43 / 43 / 21
Регистрация: 24.08.2015
Сообщений: 136
19.09.2015, 12:06 9
nmcf, менять не может, но вычиснять значение функции только тогда, когда требуется результат вполне, у меня на debug и release по разному работает к примеру
0
148 / 118 / 37
Регистрация: 27.10.2011
Сообщений: 690
22.09.2015, 19:01  [ТС] 10
Отключение оптимизации почему то не помогло. Компилятор VC++ 2013.
Для себя решил проблему с помощью __forceinline.
Насколько я знаю, этот спецификатор не переносим между компиляторами, а посему прошу знатоков написать альтернативы этой директивы для других компиляторов (вдруг кто то с такой же проблемой наткнётся на эту тему)
0
43 / 43 / 21
Регистрация: 24.08.2015
Сообщений: 136
22.09.2015, 19:40 11
Nikitko_Cent, я бы просто вставил try блок, тогда должно нормально выполняться
C++
1
2
3
4
5
6
7
try{
 
    start = clock();
    pi = getPi(n);
    finish = clock();
    }catch(int){
    }
0
22.09.2015, 19:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2015, 19:40
Помогаю со студенческими работами здесь

Возможно ли сделать отсчет времени в лотусе Clock In/ Clock Out
Привет лотусистам! Такая вот задача. Когда человек приходит на работу он в лотусе где то ставит...

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

Замер времени выполнения функции postgres
Добрый день, у меня есть функция в которой 2 цикла for и в каждом этом цикле есть еще 2 внутренних...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru