我想在代码片段(单独的函数)中收集程序的运行时,当前的策略是计算每个部分的执行时间(chrono::duration
)并将它们加在一起。但我必须处理两种不同的情况(使用不同的输入调用两次函数),并使用静态变量timer
来保持分隔的持续时间。现在我想在第二种情况之前重置变量。我怎样才能做到这一点?当然我可以使用两个连续的system_clock :: now()的持续时间,但这似乎是不必要的。
我尝试timer = 0
或timer(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();
}
答案 0 :(得分:2)
我的回答是 abit ,但这里有:
timer_A = std::chrono::miliseconds::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<>;
答案 1 :(得分:1)
如果是毫秒类型:timer_A = milliseconds(0);