如何计算C++中精确的代码运行时间

zhangbinghe 2013-05-25 10:37:49
C++代码正在运行时可能遇到CPU处理这段程序的时间片用完,转而执行其他的任务,之后,又轮到执行该段程序的时间片,如此反复,直到程序代码被执行完。现在,我想问的是:如何精确的计算代码的CPU运行时间,而不考虑其他任务CPU的时间。

急,在线等!!!!
...全文
592 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
zybjtu 2013-06-18
  • 打赏
  • 举报
回复
不要把时间浪费在这种不精确的测量中,毫无意义啊
赵4老师 2013-06-18
  • 打赏
  • 举报
回复
引用 19 楼 lm_whales 的回复:
[quote=引用 17 楼 zhao4zhong1 的回复:] 一微秒天宫一号飞过多少米谁知道?
好像是速度为 7.480km/s : 1μs 7480 m/s *10^-6 s=0.00748 =7.480mm 运行的很慢的了,还没有移动1cm 当然比汽车火车快多了! [/quote] 高人啊! 所以我之前猜测神十任务计时精确到1微秒就足够了。 根据你这个计算,假设计时误差1毫秒,也就差大约七八米,计时误差1秒,也就差大约七八千米,都还是可以接下来继续实现和天宫一号手控对接的。
lm_whales 2013-06-18
  • 打赏
  • 举报
回复
引用 17 楼 zhao4zhong1 的回复:
一微秒天宫一号飞过多少米谁知道?
好像是速度为 7.480km/s : 1μs 7480 m/s *10^-6 s=0.00748 =7.480mm 运行的很慢的了,还没有移动1cm 当然比汽车火车快多了!
lm_whales 2013-06-18
  • 打赏
  • 举报
回复
引用 17 楼 zhao4zhong1 的回复:
一微秒天宫一号飞过多少米谁知道?
你不是很牛吗? 也许你知道,这种无参照系的事情,泛泛而谈是搞不明白的; 要有参照系,即 1,参照物, 2,参照坐标系 3,相对速度,参照系也是在运动的,绝对运动是存在的,却是不可描述的,能描述的都是相对运动。 4,参照系的时空几何特性,这个只能用等效性来衡量,没有绝对正确的尺度。 5,物质性,这个好像是霍金发现的,相对论里不包含物质,在里面的作用,只有运动的作用,真实世界是物质的世界,似乎热力学性质,正是物质的代表。 似乎像天宫一号,包括神十运动速度并不很快,--- 在宇宙中,很多物体,物质比她们快多了; 当然这依然是个了不起的成就!!!!、 虽然刚刚起步,作为中国人,这也是值得骄傲的,如果这里面有自己的一丝功劳,那就更自豪了!!! 很遗憾,本人无与焉!!!
lm_whales 2013-06-18
  • 打赏
  • 举报
回复
引用 20 楼 zhao4zhong1 的回复:
[quote=引用 19 楼 lm_whales 的回复:] [quote=引用 17 楼 zhao4zhong1 的回复:] 一微秒天宫一号飞过多少米谁知道?
好像是速度为 7.480km/s : 1μs 7480 m/s *10^-6 s=0.00748 =7.480mm 运行的很慢的了,还没有移动1cm 当然比汽车火车快多了! [/quote] 高人啊! 所以我之前猜测神十任务计时精确到1微秒就足够了。 根据你这个计算,假设计时误差1毫秒,也就差大约七八米,计时误差1秒,也就差大约七八千米,都还是可以接下来继续实现和天宫一号手控对接的。 [/quote] 问题是影响因素太多,有很多不确定因素,这个如果不能及时处理,就不是这一点误差的影响了。 如果情况是确定的,不论多么复杂,都不是很难的事情,最难的是不确定因素的影响!!! 当然,还有些是阈值的影响,你的技术达不到的话,计算出来也没有用。 技术达到了,剩下的就是人的因素了!!!
赵4老师 2013-06-17
  • 打赏
  • 举报
回复
一微秒天宫一号飞过多少米谁知道?
lm_whales 2013-06-17
  • 打赏
  • 举报
回复
引用 14 楼 mujiok2003 的回复:
使用高精度的计时器。 for windows:

BOOL WINAPI QueryPerformanceCounter(
  _Out_  LARGE_INTEGER *lpPerformanceCount
);
BOOL WINAPI QueryPerformanceFrequency(
  _Out_  LARGE_INTEGER *lpFrequency
);
++ 这个是RTSC指令吧,不过其他程序的运行实际就不能直接排除了!!!
mujiok2003 2013-06-15
  • 打赏
  • 举报
回复
使用高精度的计时器。 for windows:

BOOL WINAPI QueryPerformanceCounter(
  _Out_  LARGE_INTEGER *lpPerformanceCount
);
BOOL WINAPI QueryPerformanceFrequency(
  _Out_  LARGE_INTEGER *lpFrequency
);
lm_whales 2013-06-15
  • 打赏
  • 举报
回复
竞赛这种计时,10~100 ns 的计时,已经非常精确了,1μs的精确度应该也够了,不知这个 API GetProcessTimes的精度够不够; 当然每秒18.5 次的系统定时器,肯定是不够; GetTickCount,计时精度也许不够,就不用说GetTickCount只能统计程序自己的运行时间了(要除去线程切换和调度,以及别的线程的运行时间)。 另外,驱动程序之类的会窃取线程的运行时间。操作系统的页面切换也不是程序本身的运行时间。 所以即便能够精确统计程序运行时间,也不完全是代码的运行时间,只是可以大概测定一下罢了。 当然竞赛计时也够用了!!!
lm_whales 2013-06-15
  • 打赏
  • 举报
回复
引用 11 楼 baichi4141 的回复:
精确到CPU的一个周期? 用于实现这个功能所写的代码,需要花多少个时钟周期?
写出这个代码,大概得花1G ~ 1 GGGG个时钟周期,如果写得出来,这个功能大概只花5~100个时钟周期。
baichi4141 2013-06-14
  • 打赏
  • 举报
回复
精确到CPU的一个周期? 用于实现这个功能所写的代码,需要花多少个时钟周期?
赵4老师 2013-06-14
  • 打赏
  • 举报
回复
搜“测不准原理”?
lm_whales 2013-06-14
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
[quote=引用 7 楼 lm_whales 的回复:] [quote=引用 5 楼 adlay 的回复:] 在 windows 下, 有个 API GetProcessTimes 可以获得进程使用的 CPU 时间, 包括在用户代码和内核代码里面运行的时间. 这个时间是排除了其它任务运行时间的. Linux 可以通过读取 /proc/$PID/stat 文件来获得同样的信息.
++ 这个好,不知道精确不???[/quote] 啥叫精确?误差<±0.001纳秒?[/quote] 绝对精确就是精确到CPU的一个时钟周期,不过这做不到,不过代码本身运行是很快的,很多小程序运行都不要1个纳秒。 误差<±0.001纳秒当然好,不过能做到吗??? 1个纳秒的误差已经很精确了。 如果计时误差在微秒或者毫秒级,对小数据的程序,(<=1000000)个数据,计时就是很不精确的了,除非是个很耗时的算法. 不过像竞赛这种时候,微秒级也就可以了。
赵4老师 2013-06-14
  • 打赏
  • 举报
回复
引用 7 楼 lm_whales 的回复:
[quote=引用 5 楼 adlay 的回复:] 在 windows 下, 有个 API GetProcessTimes 可以获得进程使用的 CPU 时间, 包括在用户代码和内核代码里面运行的时间. 这个时间是排除了其它任务运行时间的. Linux 可以通过读取 /proc/$PID/stat 文件来获得同样的信息.
++ 这个好,不知道精确不???[/quote] 啥叫精确?误差<±0.001纳秒?
lm_whales 2013-06-14
  • 打赏
  • 举报
回复
引用 5 楼 adlay 的回复:
在 windows 下, 有个 API GetProcessTimes 可以获得进程使用的 CPU 时间, 包括在用户代码和内核代码里面运行的时间. 这个时间是排除了其它任务运行时间的. Linux 可以通过读取 /proc/$PID/stat 文件来获得同样的信息.
++ 这个好,不知道精确不???
赵4老师 2013-06-13
  • 打赏
  • 举报
回复
使用电脑计时有时误差会很大,因为待测程序段的运行会影响电脑时钟。 将待测程序段循环足够多次,手动掐秒表计时可能更准确。
www_adintr_com 2013-06-13
  • 打赏
  • 举报
回复
在 windows 下, 有个 API GetProcessTimes 可以获得进程使用的 CPU 时间, 包括在用户代码和内核代码里面运行的时间. 这个时间是排除了其它任务运行时间的. Linux 可以通过读取 /proc/$PID/stat 文件来获得同样的信息.
lm_whales 2013-06-13
  • 打赏
  • 举报
回复
要不试试做个驱动程序用来计时,一旦线程切换,不计算运行时间。
lm_whales 2013-06-13
  • 打赏
  • 举报
回复
这个不太好办,用API钩子钩住操作系统的线程调度函数试试看。 线程切换,应用程序自己很难计算的!!!
zhangbinghe 2013-05-25
  • 打赏
  • 举报
回复
window和linux下,应该怎样分别实现,请详述!谢谢
加载更多回复(1)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧