容易测量过的时间

容易测量过的时间

我试着用时间()来测量我节目的各个方面。

我不明白的是,为什么前后的值是一样的?我知道这不是最好的方式来分析我的程序,我只是想看看需要多长时间。

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毫秒?


皈依舞
浏览 652回答 3
3回答

四季花海

#include&nbsp;<ctime>void&nbsp;f()&nbsp;{ &nbsp;&nbsp;using&nbsp;namespace&nbsp;std; &nbsp;&nbsp;clock_t&nbsp;begin&nbsp;=&nbsp;clock(); &nbsp;&nbsp;code_to_time(); &nbsp;&nbsp;clock_t&nbsp;end&nbsp;=&nbsp;clock(); &nbsp;&nbsp;double&nbsp;elapsed_secs&nbsp;=&nbsp;double(end&nbsp;-&nbsp;begin)&nbsp;/&nbsp;CLOCKS_PER_SEC;}这个time()函数只能在一秒钟内精确,但是CLOCKS_PER_SEC“时钟”在一秒钟内。这是一个简单的,便携的测量,尽管它过于简化。

HUWWW

你可以的时间测量机构并让每个可调用的运行时用最小额外代码,只需通过计时器结构调用即可。另外,在编译时,您可以定时类型参数化(毫秒、纳秒等)多亏了洛基·阿斯塔里以及使用各种模板的建议。&nbsp;这,这个是转发函数调用的原因。#include&nbsp;<iostream>#include&nbsp;<chrono>template<typename&nbsp;TimeT&nbsp;=&nbsp;std::chrono::milliseconds>struct&nbsp;measure{ &nbsp;&nbsp;&nbsp;&nbsp;template<typename&nbsp;F,&nbsp;typename&nbsp;...Args> &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;typename&nbsp;TimeT::rep&nbsp;execution(F&&&nbsp;func,&nbsp;Args&&...&nbsp;args) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;start&nbsp;=&nbsp;std::chrono::steady_clock::now(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::forward<decltype(func)>(func)(std::forward<Args>(args)...); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;duration&nbsp;=&nbsp;std::chrono::duration_cast<&nbsp;TimeT>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(std::chrono::steady_clock::now()&nbsp;-&nbsp;start); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;duration.count(); &nbsp;&nbsp;&nbsp;&nbsp;}};int&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;measure<>::execution(functor(dummy))&nbsp;<<&nbsp;std::endl;}演示根据评论霍华德·辛南特在必要之前最好不要逃出计时系统。因此,上面的类可以让用户选择调用。count通过提供额外的静态方法(如C+14所示)template<typename&nbsp;F,&nbsp;typename&nbsp;...Args>static&nbsp;auto&nbsp;duration(F&&&nbsp;func,&nbsp;Args&&...&nbsp;args){ &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;start&nbsp;=&nbsp;std::chrono::steady_clock::now(); &nbsp;&nbsp;&nbsp;&nbsp;std::forward<decltype(func)>(func)(std::forward<Args>(args)...); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;std::chrono::duration_cast<TimeT>(std::chrono::steady_clock::now()-start);}&nbsp;//&nbsp;call&nbsp;.count()&nbsp;manually&nbsp;later&nbsp;when&nbsp;needed&nbsp;(eg&nbsp;IO)auto&nbsp;avg&nbsp;=&nbsp;(measure<>::duration(func)&nbsp;+&nbsp;measure<>::duration(func))&nbsp;/&nbsp;2.0;对那些最有用的客户来说“想要在I/O之前对一系列持续时间进行后处理(例如平均值)”完整代码可以在这里找到..我试图建立一个基准工具基于时间记录这里.如果C+17std::invoke中调用可调用的execution可以这样做:invoke(forward<decltype(func)>(func),&nbsp;forward<Args>(args)...);提供作为指向成员函数的指针的可调用项。

MMTTMM

//***C++11&nbsp;Style:***std::chrono::steady_clock::time_point&nbsp;begin&nbsp;=&nbsp;std::chrono::steady_clock::now();std::chrono::steady_clock::time_point&nbsp;end=&nbsp;std::chrono::steady_clock::now();std::cout&nbsp;<<&nbsp;"Time&nbsp;difference&nbsp;=&nbsp;"&nbsp;<<&nbsp;std::chrono::duration_cast<std::chrono::microseconds>(end&nbsp;-&nbsp;begin).count()&nbsp;<<std::endl;std::cout&nbsp;<<&nbsp;"Time&nbsp;difference&nbsp;=&nbsp;"&nbsp;<<&nbsp;std::chrono::duration_cast<std::chrono::nanoseconds>&nbsp;(end&nbsp;-&nbsp;begin).count()&nbsp;<<std::endl;
打开App,查看更多内容
随时随地看视频慕课网APP