gpt4 book ai didi

c++ - 如何重置 chrono::duration 值?

转载 作者:行者123 更新时间:2023-11-30 01:13:42 25 4
gpt4 key购买 nike

我想在代码片段(单独的函数)中收集我的程序的运行时间,当前的策略是计算每个部分的执行时间(chrono::duration)并将它们相加。但是我必须处理两种不同的情况(使用不同的输入两次调用函数),并且我使用静态变量 timer 来保持分离的持续时间。现在我想在第二种情况之前重置变量。我怎样才能做到这一点?当然我可以使用两个连续的 system_clock::now() 的持续时间,但这似乎没有必要。我试过 timer = 0timer(0),但不起作用。示例:

class myClass {
static std::chrono::milliseconds timer_A;
void foo();
void bar();
}

在cpp文件中:

std::chrono::milliseconds timer_A(0);
foo() {
...
// get someDuration1;
timer_A += someDuration1;
....
}
bar() {
...
// get someDuration2;
timer_A += someDuration2;
...
cout << timer_A.count();
}

有一个main()会调用foo()bar()两次。即,

int main() {
if(someCondition) {
foo();
bar();
}
if(otherCondition) {
// here I need reset timer_A to 0 s.t. record the runtime again, how ??????????
foo();
bar();
}

最佳答案

我的回答 有点晚了,但这里是:

timer_A = std::chrono::milliseconds::zero();

您还可以创建一个持续时间模板,然后使用其 Zero() 函数,这样您就不必知道持续时间的衡量标准(见下文)。

Chrono 没有自己的计时器类,但您可以非常轻松地创建一个:

//----------------------------------------------------------------
/* Timer
Simple timer class using C++11 chrono.
example use:
{
Timer_t t; // use global typedef for standard timer.
t.Start(); // start the timer.
... do something you want to time ...
t.End(); // end the timer
t.CalcDuration; // Calculate and store (inside the Timer class) the interval between start and end.
cout << "Time in milliseconds: " << t.GetDuration().count() << end; // cout the interval
}
*/
template< typename precision = long double, typename ratio = std::milli >
class Timer final
{
public:
//---------------- aliases ----------------
using timeDuration_t = std::chrono::duration<precision, ratio>;
using timePoint_t = std::chrono::time_point<std::chrono::system_clock, timeDuration_t>;
using this_type = Timer< precision, ratio >;

//---------------- special member functions ----------------
// NOTE: all the default compiler generated member functions will suffice.

//---------------- member functions ----------------

//--------------------------------
/* Start()
Starts the timer.
*/
inline void Start()
{
m_start = std::chrono::system_clock::now();
}

//--------------------------------
/* End()
Ends the timer.
*/
inline void End()
{
m_end = std::chrono::system_clock::now();
}

//--------------------------------
/* CalcDuration()
Calculates the time elapsed (duration)
in between the previous calls to Start and End().

NOTE: make sure to have called Start() and End() before calling this function.
NOTE: Start() and End() can be called in any order.
*/
void CalcDuration()
{
m_duration = std::max( m_start, m_end ) - std::min( m_start, m_end );
}

//--------------------------------
/* GetDuration()
Returns the calculated duration.

NOTE: make sure to call CalcDuration() before calling this function.
*/
timeDuration_t const& GetDuration() const
{
return m_duration;
}

//--------------------------------
/* Zero()
Zeros the internal members, effectively resetting the Timer.
*/
void Zero()
{
m_start = timeDuration_t::zero();
m_end = m_start;
m_duration = m_end;
}

//--------------------------------
/* TestLatency( i_count )
Tests the latency / error of the timer class.

NOTE: this number is how inaccurate your timings can be.
*/
static timeDuration_t TestLatency( size_t const i_count = 512 )
{
this_type t;
timeDuration_t tSum = timeDuration_t::duration::zero();
for( size_t i = 0; i < i_count; ++i )
{
t.Start();
t.End();
t.CalcDuration();
tSum += t.GetDuration();
}
return tSum / i_count;
}

private:
//---------------- private member data ----------------
timePoint_t m_start;
timePoint_t m_end;
timeDuration_t m_duration;
};

using Timer_t = Timer<>;

关于c++ - 如何重置 chrono::duration 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31598516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com