我正在尝试计算某个功能运行所需的时间
#include <iostream>
#include <cstdlib>
#include <ctime>
#include "time.h"
int myFunction(int n)
{
.............
}
int n;
time_t start;
std::cout<<"What number would you like to enter ";
std::cout << std::endl;
std::cin>>n;
start = clock();
std::cout<<myFunction(m)<<std::endl;
std::cout << "Time it took: " << (clock() - start) / (double)(CLOCKS_PER_SEC/ 1000 ) << std::endl;
std::cout << std::endl;
这在x-code(获得4.2,2.6 ......这样的数字)中运行良好,但是在基于linux的服务器上我并不总是得到0.任何想法为什么会这样,以及如何解决它?
答案 0 :(得分:0)
&#34; tick&#34; clock
的{{1}}可能超过1/CLOCKS_PER_SEC
秒,例如可能是10毫秒,15.832761毫秒或32微秒。
如果你的代码消耗的时间小于这个&#34;勾选&#34;,那么所用的时间将显示为零。
没有简单的方法可以找出它是什么,除了 - 你可以反复调用clock
,直到返回值与上次不一样,但这可能不完全可靠,如果时钟标记非常小,可能在那个方向上不准确,但如果时间很长,你可能会发现。
为了测量非常短的时间(几毫秒),并假设该功能完全是CPU /内存限制,并且没有花时间等待文件I / O或通过网络发送接收数据包,那么std::chrono
可以用来衡量时间。对于非常短的时间,使用处理器时间戳计数器也可以是一种方法,尽管使用它可能非常棘手,因为它的速度根据负载而变化,并且在不同的核心之间可能具有不同的值。
在我的编译器项目中,我使用它来衡量事物的时间:
这部分进入标题:
class TimeTrace
{
public:
TimeTrace(const char *func) : impl(0)
{
if(timetrace)
{
createImpl(func);
}
}
~TimeTrace() { if(impl) destroyImpl(); }
private:
void createImpl(const char *func);
void destroyImpl();
TimeTraceImpl *impl;
};
这会进入源文件。
class TimeTraceImpl
{
public:
TimeTraceImpl(const char *func) : func(func)
{
start = std::chrono::steady_clock::now();
}
~TimeTraceImpl()
{
end = std::chrono::steady_clock::now();
uint64_t elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end-start).count();
std::cerr << "Time for " << func << " "
<< std::fixed << std::setprecision(3) << elapsed / 1000.0 << " ms" << std::endl;
}
private:
std::chrono::time_point<std::chrono::steady_clock> start, end;
const char* func;
};
void TimeTrace::createImpl(const char *func)
{
impl = new TimeTraceImpl(func);
}
void TimeTrace::destroyImpl()
{
delete impl;
}
相当完整的pImpl
实施的原因是,当关闭时间时,我不想让代码负担额外的工作(timetrace
是false
)
当然,std::chrono
的最小实际刻度也会有所不同,但在大多数Linux实现中,它将是纳秒或其中的一小部分,因此(更多)精度高于clock
。
缺点是它测量的是经过的时间,而不是CPU的使用情况。当瓶颈是CPU和内存时,这很好,但不适用于依赖外部硬件执行某些操作的东西[除非你真的想要测量]。