基本编程语句的效率特性

 

基本编程语句的效率特性

一、选择语句的效率特性

1、  充分考虑if语句中逻辑表达式的执行效率

if中的逻辑表达式的运算遵循一下两个原则:

1、表达式从左到右求值。

2、当确定结果后,将不再进行计算。对于逻辑(&&)与而言,当出现表达式为假时停止运算;对于逻辑或(||)而言,当出现表达式为真时停止以后的运算。

例子:

//不充分逻辑与

       char str[] = "hello world!";

       int b = 0;

       if((strlen(str)) > 10 && b > 10)

       {

              k++;

       }

//充分逻辑与

       char str[] = "hello world!";

       int b = 0;

       if(b > 10 && (strlen(str)) > 10)

       {

              k++;

       }

//不充分逻辑或

       char str[] = "hello world!";

       int b = 11;

       if((strlen(str)) > 10 || b > 10)

       {

              k++;

       }

//充分逻辑或

       char str[] = "hello world!";

       int b = 11;

       if(b > 10 || (strlen(str)) > 10)

       {

              k++;

       }

2、  多层次判断下的效率特性

在多层次if语句的执行中,首先判断是否满足第一个条件,若满足则停止后面的比较,若不满足则进行第二个比较,依次进行。这必然导致越是后面的比较需要执行的语句越多,最后面的比较需要执行的语句最多。这必然要求我们将最有可能执行的语句尽可能的放在if…else结构的前部。

例子:若a的值小于10的概率比较大,介于10100之间次之,大于100小于1000的概率最小则,如此安排比较顺序,则有助于提高效率。

       if(a < 10)

       {

              Function1();

       }

       else if(a < 100)

       {

              Function2();

       }

       else if(a < 1000)

       {

              Function3();

       }

3、  转移表的效率特性

当选项的范围可以转化为连续的数字范围(01234)时,可以考虑运用转移表。其原理为:将待调用的函数指针插入表中,用选择项作为表的索引直接调用相应函数。

例子:

       typedef long (*Functs)(char c);

       Functs JumpTable[] = {Fun1, Fun2, Fun3, Fun4};

      

       long result = JumpTable[selector](c);

注:转移表解决方案的实现对每个可能的选择拥有同样的执行效率。

4、  switch语句的效率特性

switch语句均可以转化为if…else语句实现,但是switch语句拥有较高的效率,因为编译器自动对其进行了优化,对于连续的数字将自动转化为转移表实现,对于随机的常数表达式将通过二分优化等方法进行优化。

switch语句中,default中的语句最先执。故我们尽可能的把最经常执行的选择设置为默认情况。

二、循环语句的效率特性

循环语句可以一次编码重复执行,使得代码显得紧凑。但是循环可以在很大程度上影响程序的性能,如果循环体内存在低效的部分,循环会将其成倍的放大,此倍数即为循环体重复的次数。除了尽量提高循环体内语句的执行效率之外,我们还应该尽量的减少不必要的循环来提高程序的效率。

1、  退出循环

通过设置退出标志作为循环判断的条件,并且当可以完成查找后设置循环标志为真。从而退出循环。

void FindId(Student *stu, int index, int searchId)

{

       int flag = 0;

       for(int i = 0; i < index && !flag; i++)

       {

              if(stu.GetId() == searchId)

              {

                     flag = 1;

              }

              ......

       }

}

break语句可以使得我们在达到我们的目的后,直接退出循环,从而省去不必要的循环执行。

void FindId(Student *stu, int index, int searchId)

{

       for(int i = 0; i < index; i++)

       {

              if(stu.GetId() == searchId)

              {

                     break;

              }

              ......

       }

}

       在达到目的后直接返回也可以达到直接退出循环的目的。

int FindId(Student *stu, int index, int searchId)

{

       for(int i = 0; i < index; i++)

       {

              if(stu.GetId() == searchId)

              {

                     return stu.GetAge();

              }

              ......

       }

}

2、  跳过部分循环

continue语句可以跳过循环体内不必要的语句来加速循环。

void FindId(Student *stu, int index, int searchId)

{

       for(int i = 0; i < index; i++)

       {

              if(stu.GetId() < searchId)

              {

                     continue;

              }

              ......

       }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值