免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7536 | 回复: 8

[函数] 问一个isdigit函数问题 [复制链接]

论坛徽章:
0
发表于 2011-07-01 12:50 |显示全部楼层
大家好,我发现在程序中经常会使用isdigit、isalpha之类的函数
我们以isdigit为例,
实际上就是判断一个字母是否是数字
我们可以用如下语句判断
if ( c >= '0' && c <= '9' )

如果使用isdigit函数,因为调用函数开销比较大
不会像上面的简单语句一样迅速执行完成,
那么是否可以认为,使用isdigit之类的函数,
可能会降低程序的执行效率

下面是isdigit函数glibc实现,并没有使用内联函数或是宏,
那么每次调用isdigit和调用普通函数一样,新起一帧栈,开销比较大
# define isdigit(c)        __isctype((c), _ISdigit)
int
__isctype (ch, mask)
     int ch;
     int mask;
{
  return (((uint16_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_CLASS) + 12
          [(int) (ch)] & mask);
}

以上是我的理解,不知对错,请指正

论坛徽章:
0
发表于 2011-07-01 13:09 |显示全部楼层
本帖最后由 vupiggy 于 2011-07-01 06:13 编辑

兄弟,世界上的数字表示不只有阿拉伯数字一种而且字符编码并非只有 ASCII 一种。你的 >= '0' && <= '9' 在某种编码底下可能是错的。如果你很喜欢自己的这个方式 (>= '0' && <= '9'),它确切的名字不应该叫 isdigit,应该叫 is_ascii_digit

论坛徽章:
0
发表于 2011-07-01 13:14 |显示全部楼层
那么,如果我的系统中确定只使用ascii编码,并且也只检查阿拉伯数字,那么不使用isdigit函数,是否反而可以提升系统速度呢?

论坛徽章:
0
发表于 2011-07-01 13:17 |显示全部楼层
原则1. 在你写15年程序之前,完成相同功能,你的代码不可能比 libc (不只是 glibc,也包括瘟到死的西裤) 的实现快
原则2. 如果你真的认为你的代码更高效,参见原则1

论坛徽章:
0
发表于 2011-07-01 13:24 |显示全部楼层
不是简单地说快慢,知其然之气所以然
我是想更深入的了解到底快在哪里,我知道glibc的代码经过很多优化
效率会很高

论坛徽章:
0
发表于 2011-07-01 14:02 |显示全部楼层
像这样的函数都是通过寄存器传递参数,效率没啥问题。另外gcc的O2选项包含了-finline-small-functions。

论坛徽章:
0
发表于 2011-07-01 14:11 |显示全部楼层
因为函数调用要需要新开辟帧栈,保存寄存器值,分配空间,执行完成退栈恢复寄存器等等,必然比简单的语句需要更多的执行时间,当然我并不清楚具体需要多少cpu时间,但是应该比一两句简单语句执行要多,那么很难说他的效率高啊,我最近读内核代码,现在就挺想把这些细节东西搞清楚,多多指教

论坛徽章:
0
发表于 2011-07-02 10:59 |显示全部楼层
因为函数调用要需要新开辟帧栈,保存寄存器值,分配空间,执行完成退栈恢复寄存器等等
yifan02 发表于 2011-07-01 07:11

老黄历了,要是你没明白我上面一帖在说什么,也没太大必要现在考虑这些问题。为示仁义,给你个链接:http://bbs.chinaunix.net/thread-1643262-1-4.html

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
发表于 2011-07-02 15:12 |显示全部楼层
正确与否且不论。我敢保证,您不能发现两者的运行效率有多大的差别。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP