为了账号安全,请及时绑定邮箱和手机立即绑定

容易测量过的时间

容易测量过的时间

皈依舞 2019-06-27 16:33:51
容易测量过的时间我试着用时间()来测量我节目的各个方面。我不明白的是,为什么前后的值是一样的?我知道这不是最好的方式来分析我的程序,我只是想看看需要多长时间。printf("**MyProgram::before time= %ld\n", time(NULL));doSomthing();doSomthingLong();printf("**MyProgram::after time= %ld\n", time(NULL));我试过: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);我如何读到**time taken = 0 26339?这是否意味着26,339纳秒=26.3毫秒?关于**time taken = 4 45025,这是否意味着4秒25毫秒?
查看完整描述

3 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

#include <ctime>void f() {
  using namespace std;
  clock_t begin = clock();

  code_to_time();

  clock_t end = clock();
  double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;}

这个time()函数只能在一秒钟内精确,但是CLOCKS_PER_SEC“时钟”在一秒钟内。这是一个简单的,便携的测量,尽管它过于简化。


查看完整回答
反对 回复 2019-06-27
?
HUWWW

TA贡献1874条经验 获得超12个赞

你可以的时间测量机构并让每个可调用的运行时用最小额外代码,只需通过计时器结构调用即可。另外,在编译时,您可以定时类型参数化(毫秒、纳秒等)

多亏了洛基·阿斯塔里以及使用各种模板的建议。 这,这个是转发函数调用的原因。

#include <iostream>#include <chrono>template<typename TimeT = std::chrono::milliseconds>struct measure{
    template<typename F, typename ...Args>
    static typename TimeT::rep execution(F&& func, Args&&... args)
    {
        auto start = std::chrono::steady_clock::now();
        std::forward<decltype(func)>(func)(std::forward<Args>(args)...);
        auto duration = std::chrono::duration_cast< TimeT> 
                            (std::chrono::steady_clock::now() - start);
        return duration.count();
    }};int main() {
    std::cout << measure<>::execution(functor(dummy)) << std::endl;}

演示

根据评论霍华德·辛南特在必要之前最好不要逃出计时系统。因此,上面的类可以让用户选择调用。count通过提供额外的静态方法(如C+14所示)

template<typename F, typename ...Args>static auto duration(F&& func, Args&&... args){
    auto start = std::chrono::steady_clock::now();
    std::forward<decltype(func)>(func)(std::forward<Args>(args)...);
    return std::chrono::duration_cast<TimeT>(std::chrono::steady_clock::now()-start);} // call .count() manually later when needed (eg IO)auto avg = (measure<>::duration(func) + measure<>::duration(func)) / 2.0;

对那些最有用的客户来说

“想要在I/O之前对一系列持续时间进行后处理(例如平均值)”


完整代码可以在这里找到..我试图建立一个基准工具基于时间记录这里.


如果C+17std::invoke中调用可调用的execution可以这样做:

invoke(forward<decltype(func)>(func), forward<Args>(args)...);

提供作为指向成员函数的指针的可调用项。


查看完整回答
反对 回复 2019-06-27
?
MMTTMM

TA贡献1869条经验 获得超4个赞

//***C++11 Style:***std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();std::chrono::steady_clock::time_point end= std::chrono::steady_clock::now();std::cout << "Time difference = " << std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count() <<std::endl;std::cout << "Time difference = " << std::chrono::duration_cast<std::chrono::nanoseconds> (end - begin).count() <<std::endl;


查看完整回答
反对 回复 2019-06-27
  • 3 回答
  • 0 关注
  • 651 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信