| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 789 人关注过本帖
标题:弱弱地问一个问题
只看楼主 加入收藏
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:17 
弱弱地问一个问题
计算某个程序的运行时间,不太明白clock()函数的运作机制,百度找不到满意的答案。
看以下两段代码:
程序代码:
#include<cstdio>
#include"time.h"

void main()
{
    int a=10;
    clock_t s,e;
    s=clock();
    
    printf("%d\n",a);
    e=clock();
    printf("%f\n",(double)(e-s)/CLOCKS_PER_SEC);
}

程序代码:
#include<cstdio>
#include"time.h"

void main()
{
    
    clock_t s,e;
    s=clock();
    int a=10;
    printf("%d\n",a);
    e=clock();
    printf("%f\n",(double)(e-s)/CLOCKS_PER_SEC);
}

两段代码,只是int a=10;这行代码的位置不一样,但是运行出来的结果却不一样。
另外,(e-s)/CLOCKS_PER_SEC这个表达式得出的结果是什么类型的数据?其单位是按秒计算、还是按毫秒计算的?
搜索更多相关主题的帖子: include 百度 double 
2013-10-31 12:37
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:5 
无论换不换结果都是不一样的....!

仰望星空...........不忘初心!
2013-10-31 12:42
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:5 
运行出来的结果却不一样,这个很正常把,就算一样的代码,那个运行的时间都有可能不一样的,

而且,理论上,下面的代码比上面的代码运行时间多了一个 (mov &a 10 的)时间,也就是a = 10的初始化时间

单位是什么不知道,我一般都用windows api  GetTickCount

[ 本帖最后由 yuccn 于 2013-10-31 12:47 编辑 ]

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-10-31 12:46
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
回复 3楼 yuccn
GetTickCount的精准度有多高?
其实我就是不太了解C标准库函数的time.h的clock()函数,在C标准库函数中的介绍是:从程序开始运行经过的时间,如果系统没有内部时钟则返回-1.
这样我就不理解究竟这个函数的返回值是一个什么类型的数据了,并且,计算时间差的时候,还要除于一个常量CLOCKS_PER_SEC。
这个常量的定义是:#define CLOCKS_PER_SEC 1000
这样的话,除于这个1000,得出来的数值是按秒来计算么?如果想转化为毫秒,该用什么来计算。这就是我的一些疑问

思考赐予新生,时间在于定义
2013-10-31 13:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
clock()是取系統時鐘時間,定義的那個宏從名字就可以看出來,“每秒的clock數目”。clock_t是一個計數器(長整型),類似於循環的計數器,而那個宏是定義每秒鐘有多少次這種計數,把前後兩次取得的clock_t數相減就是這段時間的clock數目,除以這個宏就得到秒數,要毫秒,把秒化成毫秒即可。

這個函數是根據系統時鐘計算的,但對多任務操作系統來說,程序每次運行都不一定被分配到同樣的CPU執行時間,這視同時運行的程序多寡和它們的優先級而定,所以這種依賴時鐘的時間不是程序實際運行的時間,因爲其中的一些時間是操作系統調度別的程序執行的時間,被你計算在内了。這個函數原本是在實時環境中用的。

[ 本帖最后由 TonyDeng 于 2013-10-31 14:14 编辑 ]

授人以渔,不授人以鱼。
2013-10-31 13:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
GetTickCount就是早期的18ms中斷,18ms是操作系統實際能夠檢測的最小時鐘振蕩周期,無法檢測比這個時間更短的時間。clock()函數號稱算到毫秒,但實際上那是根據理論推算出來的時間片,是從積累的時間段除出來的,並非你的程序真能檢測到18毫秒以下的運行時間。

非實時環境下的時鐘中斷和計數,都是不準確的,所以對時間精準度要求高的工作,最好用回實時系統,如DOS,這就是嵌入式編程要返回那麽低級系統的原因。

[ 本帖最后由 TonyDeng 于 2013-10-31 13:56 编辑 ]

授人以渔,不授人以鱼。
2013-10-31 13:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
最簡單地理解,clock_t的步進增量就是1毫秒,你不除以那個宏常量就是毫秒數。

授人以渔,不授人以鱼。
2013-10-31 14:11
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
调试了一下以下的代码,我也觉得这个clock函数并不能在每次运行时计算出同样的时间。
使用VS2012,我发现每次按ctrl+F5运行的时候,得到的时间值都是不同的。
再调试一下,终于知道clock_t 是long int,除于常量CLOCKS_PER_SEC 得到的值的单位就是秒,再转换成double类型输出。

不过这样的测定程序运行时间似乎不准确,每次运行时得到的时间值都不一样。但代码固定是那些不变了的,编译器每次执行
它们的需要时间应该也是不变的吧,那为何会得到不同的运行时间值?

像ACM竞赛题目,它的要求都是time limit:XXX ms, memory limit: XXX kb
在这里,他们是如何计算参赛者的程序代码的时间复杂度?
程序代码:
#include<cstdio>
#include"time.h"
void main()
{
    int a=10;
    double x;
    clock_t s,e;
    s=clock();

    printf("%d\n",a);
    e=clock();
    x=(double)(e-s)/CLOCKS_PER_SEC;
    printf("%f\n",x);
}


 

思考赐予新生,时间在于定义
2013-10-31 14:12
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
之所以现在在根究这个如何测定程序代码运行所需的时间的问题,是因为我现在在设计一些算法,求最优二叉树,遍历二叉树结点的算法,

写出了几种算法,放在VS中运行,结果是一样的,压根看不出哪个算法的时间用得最少,所以才想弄清楚怎么测定一段程序代码的运行时间

思考赐予新生,时间在于定义
2013-10-31 14:18
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
不是说了时间复杂度吗?    想想算法里面的时间复杂度如何算?  再结合计算机每秒大概运算多少次来估计!
1s大概能忍受10^9 --10^10的时间复杂度

仰望星空...........不忘初心!
2013-10-31 14:19
快速回复:弱弱地问一个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039216 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved