获取从上一秒开始的经过的毫秒数

34 浏览
0 Comments

获取从上一秒开始的经过的毫秒数

我正在尝试使用time()来测量程序的不同点。\n我不明白的是为什么before和after的值是相同的?我知道这不是优化程序的最佳方法,我只想看看某个操作需要多长时间。\n

printf("**MyProgram::before time= %ld\n", time(NULL));
doSomething();
doSomethingLong();
printf("**MyProgram::after time= %ld\n", time(NULL));

\n我尝试过:\n

struct timeval diff, startTV, endTV;
gettimeofday(&startTV, NULL); 
doSomething();
doSomethingLong();
gettimeofday(&endTV, NULL); 
timersub(&endTV, &startTV, &diff);
printf("**time taken = %ld %ld\n", diff.tv_sec, diff.tv_usec);

\n如何读取**time taken = 0 26339的结果?那意味着26,339纳秒=26.3毫秒吗?\n那**time taken = 4 45025呢,那是4秒和25毫秒吗?

0
0 Comments

问题的出现原因:clock()函数只能精确到秒,而无法得到毫秒级的时间。

解决方法:使用更精确的方法来获取从上一秒开始的毫秒数。

整理成的文章如下:

clock()函数只能精确到秒,但是在一秒钟内有很多个时钟周期。尽管这种方法过于简化,但是它是一个简单而可移植的测量方法。

需要注意的是,clock()函数测量的是CPU时间,而不是实际经过的时间(实际经过的时间可能要长得多)。

在编写用于集群的并行代码时,这种方法无法反映真实世界的时间...

这似乎是最简单的方法。你愿意更新或回应之前的评论吗?

上述解决方法并不是一个好的解决方法,原因有很多。这是正确的答案 - stackoverflow.com/questions/2962785/…

我尝试了这个解决方法,正如评论所建议的那样,我的计时器比实际时间运行得快得多。

0
0 Comments

问题的出现原因:从上面的内容中可以看出,问题的出现是因为需要计算从上一秒开始的经过的毫秒数,这涉及到时间差的计算。

解决方法:根据上面的内容,可以总结出以下几种解决方法:

1. 使用delta函数计算时间差,代码如下:

auto start = std::chrono::steady_clock::now();
std::cout << "Elapsed(ms)=" << since(start).count() << std::endl;
template <
    class result_t   = std::chrono::milliseconds,
    class clock_t    = std::chrono::steady_clock,
    class duration_t = std::chrono::milliseconds
>
auto since(std::chrono::time_point const& start)
{
    return std::chrono::duration_cast(clock_t::now() - start);
}

2. 使用基于std::chrono的计时器,代码如下:

Timer clock; // Timer
clock.tick();
/* code you want to measure */
clock.tock();
cout << "Run time = " << clock.duration().count() << " ms\n";
template 
class Timer
{
    using timep_t = typename ClockT::time_point;
    timep_t _start = ClockT::now(), _end = {};
public:
    void tick() { 
        _end = timep_t{}; 
        _start = ClockT::now(); 
    }
    void tock() { _end = ClockT::now(); }
    template  
    auto duration() const { 
        gsl_Expects(_end != timep_t{} && "toc before reporting"); 
        return std::chrono::duration_cast(_end - _start); 
    }
};

3. 可以对任何可调用对象进行性能测试,代码如下:

cout << "F runtime=" << measure<>::duration(F, arg1, arg2).count() << "ms";
template 
struct measure
{
    template
    static auto duration(F&& func, Args&&... args)
    {
        auto start = ClockT::now();
        std::invoke(std::forward(func), std::forward(args)...);
        return std::chrono::duration_cast(ClockT::now()-start);
    }
};

计算从上一秒开始的经过的毫秒数可以通过使用delta函数、基于std::chrono的计时器或对任何可调用对象进行性能测试来实现。

其中,delta函数的实现如上述代码所示,通过获取起始时间点和当前时间点的时间差来计算经过的时间。

基于std::chrono的计时器的实现如上述代码所示,通过在代码开始和结束的位置记录时间点,并计算时间差来得到经过的时间。

对任何可调用对象进行性能测试的实现如上述代码所示,通过记录起始时间点和结束时间点,并计算时间差来得到经过的时间。

这些方法都可以用于计算从上一秒开始的经过的毫秒数。

0
0 Comments

问题出现的原因是需要获取从上一秒开始的经过的毫秒数,解决方法是使用C++11的chrono库来实现。

首先,需要引入#include <chrono>指令,并使用std::chrono::steady_clock来获取当前时间点。代码中的begin = std::chrono::steady_clock::now()用于获取开始时间点,end = std::chrono::steady_clock::now()用于获取结束时间点。

接下来,可以使用std::chrono::duration_cast函数来计算时间差,并使用count()函数获取时间差的值。例如,std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count()可以获取时间差的微秒数。

如果想要以秒为单位报告时间差,可以使用std::cout << "Time difference (sec) = " << (std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count()) /1000000.0 <<std::endl;来输出时间差的秒数。

在编译时,需要添加-std=c++11标志来启用C++11的特性。

根据cppreference上的文档,std::chrono::steady_clock与墙钟时间无关,适合用于测量时间间隔。

如果希望返回秒为单位的时间间隔,应该更仔细地查看std::chrono::duration_cast函数,特别是std::chrono::seconds

std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count()返回的数据类型是std::chrono::microseconds::rep,可以在chrono duration文档中找到相关类型。

这个问题的解答使用了完整的类型,而不是使用"auto",这样更容易理解。

,通过使用C++11的chrono库,可以方便地获取从上一秒开始的经过的毫秒数。

0