免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2682 | 回复: 6
打印 上一主题 下一主题

[函数] 请教一个取执行时间的函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-28 12:05 |只看该作者 |倒序浏览
在论坛精华里面找到一个得到程序执行时间的例子,运行通过,但是我想把它改成一个函数,方便调用。
直接写在程序主体中,可用
  1. int main(int argc, char *argv[])
  2. {
  3.         struct timeval tpstart,tpend;
  4.   long   iTimeInterval
  5. gettimeofday(&tpstart,NULL);
  6. fileIORW(argv[1],atoi(argv[2]));         //一个测试文件IO读取的函数
  7. gettimeofday(&tpend,NULL);
  8. iTimeInterval=1000000 * (tpend.tv_sec - tpstart.tv_sec);
  9. iTimeInterval += tpend.tv_usec - tpstart.tv_usec;
  10. printf("used time:  %d milliseconde\n",iTimeInterval);
  11. return 0;
  12. }
复制代码

写成函数

  1. /*当第一次运行函数前时,先赋值*inow为0,
  2.  运行结束后,inow应得到运行时的时间值,返回值为nowtime.tv_sec-(*inow),也就是与上次的inow比较的结果
  3. 第二次运行前,inow已经为上一次得到的时间值,
  4. 运行后,返回值应该为本次时间值与上一次时间值的差值才对,可惜结果不如我所料
  5. */
  6.   
  7. int rd_run_time(long *inow){
  8.          struct timeval nowtime;
  9.          long sptime;
  10.          bzero(&nowtime,sizeof(nowtime));
  11.          gettimeofday(&nowtime,NULL);
  12.          sptime=nowtime.tv_sec-(*inow);
  13.           *inow=nowtime.tv_sec;
  14.           return sptime;
  15. }
  16. int main(int argc, char *argv[])
  17. {
  18. long  test1=0;      
  19. printf("test1 run:%d\n",rd_run_time(&test1));   
  20. fileIORW(argv[1],atoi(argv[2]));  
  21. printf("test1 run:%d\n",rd_run_time(&test1));
  22. return 0;
  23. }
复制代码

结果,第一次函数调用后得到的rd_run_time返回结果是开始时的时间值没有错,但运行fileIORW函数后的第二次对d_run_time得到的消耗时间总是0。
跟踪函数rd_run_time,发现其中前后两次调用中nowtime.tv_sec的值居然是一样的!但是用gettimeofday(&nowtime,NULL); 不是应该得到当时的时间值吗?而用gdb跟踪,发现似乎又可以得到正确的值,真是奇怪。
  我以前一直是用pascal的,因为要做linux下的作业,才开始使用C不久,不知道是我的程序的错误,还是linux的gcc在编译时的优化造成的问题呢?
请高手指点.

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-04-28 12:17 |只看该作者

请教一个取执行时间的函数的问题

如果你的fileIORW执行时间不到1秒,当然是一样的

论坛徽章:
0
3 [报告]
发表于 2005-04-28 12:30 |只看该作者

请教一个取执行时间的函数的问题

那个fileIORW我测试时是去读取一个20M的文件的,花费的时间不止一秒,(在上一个不使用函数的程序里面可以得到运行的时间)

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2005-04-28 12:40 |只看该作者

请教一个取执行时间的函数的问题

如果你只想得到秒级的时间,用time()就可以
如果要得到微秒级的时间才用gettimeofday()
你把tv_usec打出来看看不就行了?
你怎么能确定读20M文件一定会超过一秒?

论坛徽章:
0
5 [报告]
发表于 2005-04-28 13:02 |只看该作者

请教一个取执行时间的函数的问题

我用的这个就是毫秒级的。至于确定会超过一秒——晕,被你套了,因为我现在要读取的根本就不是秒——超过一毫秒,是因为我把取时间的过程写在主过程的时候是有输出的,下面是我把取时间的代码写在程序主体时的一个执行结果

  1. now ready to read file use file I/O , read size 1000
  2. file I/O read finished. read total 14538777 bytes
  3. used time:  112617 milliseconde

  4. now ready to read file use stand I/O, buffer size 1000
  5. starnd I/O read finished. read total 14538000 bytes
  6. used time:  40004 milliseconde
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2005-04-28 13:35 |只看该作者

请教一个取执行时间的函数的问题

请看清楚原来的函数与你的函数有什么不同

论坛徽章:
0
7 [报告]
发表于 2005-04-29 09:46 |只看该作者

请教一个取执行时间的函数的问题

谢谢!
是我的错,没有看清楚原来的用法就直接写函数了,还以为usec没有用到呢。修改后结果正确了。想不到还会犯这种错误。//sigh
修改后函数如下:
[code]
int rd_run_time(long *inow){
    struct timeval nowtime;
    long sptime;
    bzero(&nowtime,sizeof(nowtime));
    gettimeofday(&nowtime,NULL);
    sptime=1000000*nowtime.tv_sec+nowtime.tv_usec-(*inow);
     *inow=1000000*nowtime.tv_sec+nowtime.tv_usec;
//   printf("sptime:%d -  inow:%d",sptime,*inow);
    return sptime;
}
[/cdoe]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP