免费注册 查看新帖 |

Chinaunix

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

测试两个同样功能的小程序,执行效率相差这么大!? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-12 13:27 |只看该作者 |倒序浏览
http://bbs.chinaunix.net/thread-1001379-1-1.html (求《c和指针》一道题的最优解(声明非作业帖))

对上主题中的 #19楼和#20楼 的程序做了3次对比测试,执行效率相差很大!如下:

              第一次    第二次     第三次
#19楼程序    46秒        50秒        46秒
#20楼程序    77秒      69秒      73秒


下面是两个程序的测试版代码,不知这样测试是否合理?

#19楼程序的测试代码:
#include<stdio.h>
#include<string.h>
#include<time.h>

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;int    i, len, n1, n2;
&nbsp;&nbsp;&nbsp;&nbsp;char   buf[2][15] = {0};
&nbsp;&nbsp;&nbsp;&nbsp;time_t  t1,t2;

&nbsp;&nbsp;&nbsp;&nbsp;//scanf("%s", buf[0]);


&nbsp;&nbsp;&nbsp;&nbsp;strcpy(buf[0], "1024555");
&nbsp;&nbsp;&nbsp;&nbsp;t1=time(NULL);

&nbsp;&nbsp;&nbsp;&nbsp;for(int k=0; k<100000; k++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len = strlen(buf[0]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(1 == len)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\t$0.0%s",buf[0]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else if( 2 == len)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\t$0.%s",buf[0]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n1 = (len-2)/3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n2 = (len-2)%3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(0==n1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[1][n2]='.';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( n2>0 )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[1][n2]=',';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=1; i<n1; i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[1][n2+i*3]=',';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[1][n2+i*3]='.';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\t$");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i<len; i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(buf[1][i] != 0 )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar(buf[1][i]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;putchar(buf[0][i]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;t2=time(NULL);
&nbsp;&nbsp;&nbsp;&nbsp;printf("secdiff = %d\n", t2-t1);

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


#20楼程序的测试代码:
#include<stdio.h>
#include<string.h>
#include<time.h>

char * reverse(char *s)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *p,*q,t;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = s;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q = s + strlen(s)-1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(p <  q)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t = *p;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p++ = *q;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*q-- = t;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return s;
}   

char * numformat(char * result,char * s)
{
&nbsp;&nbsp;&nbsp;&nbsp;char *q,*r;
&nbsp;&nbsp;&nbsp;&nbsp;r = result;
&nbsp;&nbsp;&nbsp;&nbsp;q = s + strlen(s) - 1;

&nbsp;&nbsp;&nbsp;&nbsp;if(q >= s)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*r++ = *q--;
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*r++ = '0';
&nbsp;&nbsp;&nbsp;&nbsp;if(q>=s)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*r++ = *q--;
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*r++ = '0';
&nbsp;&nbsp;&nbsp;&nbsp;*r++ = '.';
&nbsp;&nbsp;&nbsp;&nbsp;while(q >= s){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*r++ = *q--;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(q < s)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*r++ = *q--;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(q < s)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*r++ = *q--;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*r++ = ',';
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if(*(r-1) == ',')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--r;
&nbsp;&nbsp;&nbsp;&nbsp;if(*(r-1) == '.')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*r++ = '0';
&nbsp;&nbsp;&nbsp;&nbsp;*r++ = '$';
&nbsp;&nbsp;&nbsp;&nbsp;*r++ = '\0';
&nbsp;&nbsp;&nbsp;&nbsp;return (reverse(result));
}   

int  main()
{
&nbsp;&nbsp;&nbsp;&nbsp;char constr[30];

&nbsp;&nbsp;&nbsp;&nbsp;time_t  t1,t2;
&nbsp;&nbsp;&nbsp;&nbsp;t1=time(NULL);
&nbsp;&nbsp;&nbsp;&nbsp;for(int k=0; k<100000; k++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;  puts(numformat(constr,"1024555"));
&nbsp;&nbsp;&nbsp;&nbsp;  printf("\n");
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;t2=time(NULL);
&nbsp;&nbsp;&nbsp;&nbsp;printf("secdiff = %d\n", t2-t1);
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

论坛徽章:
0
2 [报告]
发表于 2007-10-12 13:56 |只看该作者
不应该用时间戳!
man 1 time

论坛徽章:
0
3 [报告]
发表于 2007-10-12 14:25 |只看该作者
原帖由 JohnBull 于 2007-10-12 13:56 发表
不应该用时间戳!
man 1 time


why????????????????

time函数:取得目前的时间  

time_t time(time_t *t);

函数说明: 此函数会返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数。如果t 并非空指针的话,此函数也会将返回值存到t指针所指的内存。
返回值: 成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno中。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP