clock

本文对比了clock()与clock_gettime()在计算代码执行时间和实际时间流逝上的差异。clock()记录进程CPU使用时间,适合benchmark测试;clock_gettime()能更准确测量实际时间流逝,通过CLOCK_REALTIME或CLOCK_MONOTONIC选项实现。

转载:https://www.cnblogs.com/mightycode/p/10485227.html

************************自己用过,没想到还有这个坑***********************************

原因是clock()计算的是从程序运行开始被程序进程使用的CPU时间tick,而不是真正现实世界流逝的时间。很显然这个时间肯定要比现实时间要慢的多,除非CPU只有你这么一个进程在跑,占用了全部CPU。所以如果你要benchmark一段代码,看看运行这段代码花费了多少时间,用clock()很合适。那么要比较精确地计算现实流逝地时间,怎么办呢?用clock_gettime()。

extern int clock_gettime(clockid_t, struct timespec*);

struct timespec {
 __kernel_time_t tv_sec;
 long tv_nsec;
};

第一个参数clockid_t类型常见的有四种:   

CLOCK_REALTIME:系统实时时间。
CLOCK_MONOTONIC:从系统启动时开始计时,不受系统时间被用户改变的影响。
CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间,包含该进程下的所有线程。
CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间。

可以看到,如果用CLOCK_PROCESS_CPUTIME_ID,就和直接用clock()是一样的。而要计算现实时间,就不能用后两种类型,必须用CLOCK_REALTIME或者CLOCK_MONOTONIC。要计算时间差,秒对秒一减,纳秒对纳秒一减,统一到同一个单位相加即可。

除了上面四种clockid_t类型,还有几种。

CLOCK_REALTIME_COARSE,CLOCK_MONOTONIC_COARSE:带COARSE后缀的,精度没有不带后缀的高,但是速度快。

CLOCK_MONOTONIC_RAW:和CLOCK_MONOTONIC类似,但是它是访问的硬件时间,不受NTP时间服务器的调整和adjtime()的影响。

CLOCK_BOOTTIME:和CLOCK_MONOTONIC一样,但是包含系统挂起的时间。

Kivy的`Clock`类提供了几种时钟调度机制,分别是`Clock.scheduled_once()`、`Clock.schedule_interval()`和`Clock.create_trigger()` [^1]。 ### 1. `Clock.schedule_interval()` 用于按照指定的时间间隔重复调用一个回调函数。 示例代码如下: ```python from kivy.clock import Clock def my_callback(dt): print("This callback is called every 0.5 seconds.") # 每0.5秒调用一次 my_callback 函数 event = Clock.schedule_interval(my_callback, 0.5) ``` ### 2. `Clock.schedule_once()` 用于在指定的延迟时间后调用一次回调函数。 示例代码如下: ```python from kivy.clock import Clock def my_callback(dt): print("This callback is called after 5 seconds.") # 在5秒后调用 my_callback 函数 event2 = Clock.schedule_once(my_callback, 5) ``` ### 3. `Clock.create_trigger()` 创建一个可触发的事件,当触发时,会在指定的延迟时间后调用回调函数。 示例代码如下: ```python from kivy.clock import Clock def my_callback(dt): print("This callback is called after the trigger is fired and 5 seconds delay.") event_trig = Clock.create_trigger(my_callback, 5) # 触发事件 event_trig() ``` ### 取消调度 可以使用`cancel()`方法或`Clock.unschedule()`函数来取消调度。 示例代码如下: ```python from kivy.clock import Clock def my_callback(dt): pass # 每0.5秒调用一次 my_callback 函数 event = Clock.schedule_interval(my_callback, 0.5) # 在5秒后调用 my_callback 函数 event2 = Clock.schedule_once(my_callback, 5) # 使用 cancel 方法取消调度 event.cancel() # 使用 Clock.unschedule 函数取消调度 Clock.unschedule(event2) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值