c语言如何大写字母转换成相应的小写字母处理的程序,c++大写字母变小写字母代码

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: