我如何正确使用" time.h"返回大于零的数字? C ++

时间:2016-03-06 21:24:19

标签: c++

我正在尝试计算某个功能运行所需的时间

#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.任何想法为什么会这样,以及如何解决它?

1 个答案:

答案 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实施的原因是,当关闭时间时,我不想让代码负担额外的工作(timetracefalse

当然,std::chrono的最小实际刻度也会有所不同,但在大多数Linux实现中,它将是纳秒或其中的一小部分,因此(更多)精度高于clock

缺点是它测量的是经过的时间,而不是CPU的使用情况。当瓶颈是CPU和内存时,这很好,但不适用于依赖外部硬件执行某些操作的东西[除非你真的想要测量]。