c语言如何大写字母转换成相应的小写字母处理的程序,c++大写字母变小写字母代码
优化C字母大小写转换-程序是生命-博客频道-CSDN。网
C字母大小写转换的优化
分类:
【C】
[编译]
2009-01-25 01:32
378人阅读
评论(4)
收集
报告
优化C字母的大小写转换由九天雁翎(JTianLing)编写-
blog.csdn.net/vagrxie
讨论新闻组和文档
本文以转换成小写为例。
从推荐代码重用的角度来看,使用库函数是个好主意:
选项1:
char gc1[53]= abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ ;
void wayOne()
{
strlwr(gc1);
}
优点是好用,容易被别人理解,但是效率慢,让人吐血。
extern C char * __cdecl _strlwr(
字符*字符串
)
{
if (__locale_changed==0)
{
char * cp
/*验证
第*/节
_VALIDATE_RETURN(字符串!=NULL,
EINVAL,NULL);
for(CP=字符串;* cpcp)
{
如果
( A=*cp
*cp=Z )
*cp
= A - A ;
}
return(字符串);
}
其他
{
_strlwr_s_l(string,(size_t)(-1),
NULL);
返回字符串;
}
}
周期内2.5次的平均判断,(*cp一次,if=一次的‘a’,*cp=版本号)加上每次0.5次的平均加法,虽然这样的转换O(n)是必不可少的,但是对于这么多的运算来说还是慢得可怕。
示例2:
char gc2[53]
= abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ ;
命名空间MYTEST
{
内嵌字符*
strlwr(字符
*asz)
{
for(char*
lp=gc2
*lp!=0;lp)
{
* lp =0x20
}
返回asz
}
}
void wayTwo()
{
MYTEST:strlwr(gc2);
}
本例中使用了ASCII字母值的特征,判断只有一个(*lp!=0),一位或运算。算法改进了很多:)实际上实现了1/3的效率提升。
将大量的代码,分解成只有四句话的程序:
00401020 80 08 20或字节ptr [eax],20h
00401023 83 C0 01添加eax,1
00401026 80 38 00 cmp字节ptr [eax],0
00401029 75 F5 jne way two 10h(401020h)
但是考虑到char只有1个字节,请参见
00401020 80 08 20或字节ptr [eax],20h
每句话都觉得不舒服,浪费了eax这样的4字节寄存器,所以可以这样优化:
命名空间MYTEST2
{
内嵌字符*
strlwr(字符
*asz)
{
长* lp
=(long *)gc3;
for(;*((char*)lp)!=0;lp)
{
(long)(* LP)=0x 20202020;
}
for(char*
LPC=(char *)LP;*lpc!=0;lpc)
{
* lpc =0x20
}
返回asz
}
}
说实话。。没有清晰度和可读性,但是优化的思路是充分利用4字节寄存器,用DWORD读取内存,这是一种非常高效的方式。汇编代码其实比C代码更清晰,因为C代码还是需要处理很多与类型相关的东西,而汇编代码不需要。
第一个循环汇编代码如下:
00401040 81 08 20 20 20 20或dword ptr [eax],20202020h
00401046 83 C0 04添加eax,4
00401049 80 38 00 cmp字节ptr [eax],0
0040104 c 75 F2 jne way three 10h(401040h)
循环次数减少了3/4。所以效率的优化是很明显的。单指令多数据操作的思想正是这种思想的延伸。呵呵,不过之前,影响可读性的效率优化,除非必要,否则慎用。
为了确认效率的优化,至少给个测试结果给大家看看,不然你会觉得我在胡说八道。
void wayOne()
//命中次数:1
//时间:5553.00
//陪孩子的时间:5553.00
{
strlwr(gc1);
}
void wayTwo()
//命中次数:1
//时间:247.00
//陪孩子的时间:247.00
{
MYTEST:strlwr(gc2);
}
无效方式三()
//命中次数:1
//时间:180.00
//陪孩子的时间:180.00
{
mytest 2:strlwr(gc3);
}
int _tmain(int argc,_TCHAR* argv[])
//命中次数:1
//时间:6836996435.00
//陪孩子的时间:6837002415.00
{
way three();
way two();
way one();
}
测试结果为AQtime5测试数据,单位为机器周期。因为结果很明显,所以没有重复测试。而且为了消除缓存的影响,最快的放在前面,所以即使有缓存的影响,对wayThree也是最不利的。库中5000多个函数的结果,说慢的可怕一点都不为过。当数据量很大时,这种优化差异可不是一点点。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。