免费注册 查看新帖 |

Chinaunix

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

strncmp执行效率的困惑 [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-04-16 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-13 14:26 |只看该作者 |倒序浏览
小弟在测试AIX上C程序时,发现有一段代码执行时间特别慢,代码截取如下:
         while ((strncmp(pCCJ_QDYJ_HJGKZDGD[i].ACC_NBR,calling_nbr,strlen(pCCJ_QDYJ_HJGKZDGD[i].ACC_NBR))==0)&& (i>=0) )
         {
           i--;
           if (i<0) break;
         }
结构体数据是从内存中读取的,进行简单的比较。小弟在该段代码前后加入了截取时间秒数的代码,该代码执行100000+次数时得到数据如下:用strncmp时耗费45-50秒,用strcmp耗费不足一秒。
到底是什么原因,小弟不解,是结构体问题?还是strncmp的问题?请各位大虾不吝赐教,万分感谢。

论坛徽章:
0
2 [报告]
发表于 2007-03-13 15:29 |只看该作者
是不是strlen太耗时了?

pCCJ_QDYJ_HJGKZDGD[i].ACC_NBR 有多长,是不是大部分pCCJ_QDYJ_HJGKZDGD[i].ACC_NBR 和calling_nbr一开始就不一样?

strlen需要从pCCJ_QDYJ_HJGKZDGD[i].ACC_NBR开头遍历到结尾,而strcmp和strncmp只需到不同之处。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-04-16 06:20:00
3 [报告]
发表于 2007-03-13 19:28 |只看该作者
pCCJ_QDYJ_HJGKZDGD[i].ACC_NBR一般是8位字符,而且这个i首先用二分法取到的,再判断周围有没有和calling_nbr相同的。听你一说俺也觉得好象是strlen的问题,但是要用strncmp不用strlen好像不太好办。。。郁闷

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-04-16 06:20:00
4 [报告]
发表于 2007-03-13 19:29 |只看该作者
忘了说谢谢了,lgfang,3qs

论坛徽章:
0
5 [报告]
发表于 2007-03-13 20:04 |只看该作者
确实用strncmp比strcmp要安全,可是你这里的strncmp又依赖于用strlen来取得的数据,所以,完全可以直接用strcmp。

论坛徽章:
0
6 [报告]
发表于 2007-03-13 23:57 |只看该作者
楼主是搞计费的吧。
这点小性能还研究个啥。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-04-16 06:20:00
7 [报告]
发表于 2007-03-14 08:55 |只看该作者
原帖由 foxpro7 于 2007-3-13 23:57 发表
楼主是搞计费的吧。
这点小性能还研究个啥。

呵呵,是搞计费的。不过这个东西可不小啊,计费出帐是自然月,每月月初就那么点时间,一个文件就跑3分钟,那我几千个文件。。。。这么慢肯定被人骂死啦

论坛徽章:
0
8 [报告]
发表于 2007-09-04 20:03 |只看该作者
为什么不把预先把长度算出来呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP