程序优化

程序优化


    函数lower1和lower2都是将一个字符串转换成小写格式。但是
两者的效率却相差很大。用下面提供的test函数测试,几乎接近于
一倍的关系。在我机子上测试结果是lower1:1125,lower2:656[注2]。
    但是很显然,在具体编程中,第一种形式的程序肯定会有不少,
原因是简单。而且想当然的认为两者应该差不多。笔者以前也是会
选择第一种类型。在看了Computer systems: A programmer's pr-
-espective[注1]之后,却有了新的感受。
    以前学过《编译原理》,所以当初想当然的认为编译器会对函
数lower1做优化,会自己把strlen(s)的值提到循环外部,所以想
当然的认为这两个函数应该是效率一样的。但是却忘了最关键的一
点:side effect--副作用。编译器在做优化的时候会采取保守策
略,而且由于函数存在副作用,而编译器无法判断函数的副作用是
否是编程者故意为之。所以在lower1函数中,就不会把strlen(s)
的值提到循环外部,编译器不知道是否strlen(s)只需要执行一次,
如果存在副作用的话,strlen(s)函数会修改某些全局变量时,执行
一次和执行多次,其结果是不同的。所以,保守起见,编译器对这
种情况不会优化,所以循环有几次,lower1函数中的strlen(s)就
会执行几次,所以效率会大大降低。

void lower1( char * s)
{
 for (int i = 0; i < strlen(s); i++)
  if (s[i] >= 'A' && s[i] <= 'Z')
   s[i] -= ('A' - 'a');
}

void lower2( char * s)
{
 int len = strlen(s);
 for (int i = 0; i < len; i++)
  if (s[i] >= 'A' && s[i] <= 'Z')
   s[i] -= ('A' - 'a');
}

void test()
{
 char a1[] = "TesT";
 char a2[] = "TesT";
 
 int start = clock();
 for (unsigned int i = 0; i < 10000000; i++)
 {
  lower1(a1);
 }
 int end = clock();
 cout << "lower1 time spending:" << end - start << endl;


 start = clock();
 for (i = 0; i < 10000000; i++)
 {
  lower2(a2);
 }
 end = clock();
 cout << "lower2 time spending:" << end - start << endl;
}

注:
1   Computer Systems: A Programmer's Prespective , Randal E. Bryant
    中文名:《深入了解计算机系统》,是一本不可多得的好书。从C到汇编
    再到指令,从程序到CPU到内存。从程序开始,深入到具体计算机是怎样
    执行的,对于理解程序的运行,优化程序的速度,了解计算机系统,都
    有很大的帮助。所以有时间可以多翻翻。

2   本人测试环境:P4 2.4G, 512MDDR, VC6.0, windows Pro。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值