我编写了一个非常小的代码来衡量我的乘法算法所花费的时间:
clock_t begin, end;
float time_spent;
begin = clock();
a = b*c;
end = clock();
time_spent = (float)(end - begin)/CLOCKS_PER_SEC;
我正在Windows下使用mingw。
我猜end = clock()
会在那个特定时刻给我时钟滴答声。从begin
中减去它会给我乘法消耗的时钟滴答。当我与CLOCKS_PER_SEC
分开时,我会得到总时间。
我的第一个问题是:时钟周期和时钟周期之间有区别吗?
我的算法很小,差异end-begin
为0.这是否意味着我的代码执行时间少于1个刻度,这就是为什么我得到零?
答案 0 :(得分:2)
我的第一个问题是:时钟周期和时钟周期之间有区别吗?
是。时钟周期可以是1毫秒或微秒,而时钟周期可以是0.3纳秒。在POSIX系统上,CLOCKS_PER_SEC
必须定义为1000000
(100万)。请注意,如果无法以微秒分辨率获得CPU测量值,那么clock()
的返回值中的最小跳跃将大于1。
我的算法是如此之小,以至于差异的结束开始是0.这是否意味着我的代码执行时间小于1滴答,这就是为什么我得到零?
是。为了获得更好的读数,我建议您循环足够的迭代,以便测量几秒钟。
答案 1 :(得分:1)
四是你的第一个问题:时钟滴答是指主系统时钟。它是设备识别的最小时间单位。时钟周期是完整处理器脉冲完成所需的时间。你可以通过以Hz为单位给出的cpu cpeed来识别。 2GHz处理器每秒执行2,000,000,000个时钟周期。
对于你的第二个问题:可能是的。
答案 2 :(得分:1)
从系统角度解决时钟滴答和时钟周期之间的差异
每个处理器都配有一个物理时钟(通常是石英晶体时钟),该时钟以一定的频率(振动/秒)振荡。处理器借助物理时钟产生的中断来跟踪时间,该中断在每个时间段T
都会中断处理器。此中断称为“时钟滴答”。 CPU计数自系统启动以来所看到的中断数,并在调用clock()
时返回该值。通过对两个时钟滴答值(从clock()获得)进行求和,您将获得在这两个时间点之间看到的中断次数。
大多数现代操作系统将T
值编程为1微秒,即物理时钟每1微秒中断一次,这是最低的时钟粒度,大多数物理时钟广泛支持该粒度。以1微秒为T
,可以将时钟周期计算为每秒1000000。因此,利用此信息,您可以根据两个时钟滴答值的差值(即两个滴答之间的差异*滴答周期)来计算经过的时间
注意:操作系统定义的时钟周期必须是物理时钟上的<=振动/秒,否则会降低精度
答案 3 :(得分:0)
时钟周期是时钟周期。
时钟周期是计算机处理器或CPU的速度,由振荡器的两个脉冲之间的时间量决定。一般来说,每秒脉冲数越多,计算机处理器处理信息的速度就越快。