C语言优化实例:循环中减少判断

为了让编译器更好地优化循环,应该尽量让循环中减少判断,方法之一是将判断语句整合进表达式。还是这个例子:

for (int i = 0; i < 1000*10; i++)
{
     sum += data[i/1000][i%10];
}

假如我们需要加一个判断,只有非负整数才需要作求和运算:

for (int i = 0; i < 1000*10; i++)
{
     if (data[i/1000][i%10] >= 0)
          sum += data[i/1000][i%10];
}

下面将这个判断语句整合进表达式:

for (int i = 0; i < 1000*10; i++)
{
     sum += (data[i/1000][i%10] >= 0) * data[i/1000][i%10];
}

注意这种将判断语句整合进表达式的方法不一定在任何情况下奏效。如果if条件为真的可能性很大,那么可以考虑这样整合;如果这样整合让逻辑变得很复杂,当然不建议这样做,因为编写简约明了的代码是非常重要的。最好的方法就是实际测试两个版本的性能,然后选取性能更优的。

C语言优化实例:循环中减少判断

时间: 2024-10-09 17:45:17

C语言优化实例:循环中减少判断的相关文章

C语言循环中减少判断——————【Badboy】

为了让编译器更好地优化循环,应该尽量让循环中减少判断,方法之一是将判断语句整合进表达式.还是这个例子: for (int i = 0; i < 1000*10; i++) { sum += data[i/1000][i%10]; } 假如我们需要加一个判断,只有非负整数才需要作求和运算: for (int i = 0; i < 1000*10; i++) { if (data[i/1000][i%10] >= 0) sum += data[i/1000][i%10]; } 下面将这个判断

C语言优化实例:消除多级指针的间接访问

如果一个多层次的数据结构达到两级或者两级以上,举例如下: struct A{ int array_member[100]; //其他数据成员 }; struct B{ struct A *a_ptr; //其他数据成员 } 那么通过B类型的指针b_ptr访问A类型的array_member的某一个元素array_member[0]则需要使用b_ptr->a_ptr->array_member[0]这种多级指针的形式.如果一个函数中多次用到这个变量的话,可以采用一个临时变量保存这个多级指针:in

C语言优化实例:为了消除嵌套switch-case聪明的做法

我们有可能会写出或者遇到类似这种代码: C/C++ switch (expr1) { case label11: switch (expr2) { case label21: // do something break; case label22: // do something break; default: // do something break; } break; case label12: switch (expr2) { case label21: // do something

C语言优化实例:一种消除嵌套switch-case的巧妙做法

我们有可能会写出或者遇到类似这样的代码: C/C++ switch (expr1) { case label11: switch (expr2) { case label21: // do something break; case label22: // do something break; default: // do something break; } break; case label12: switch (expr2) { case label21: // do something

PHP和JS在循环、条件判断中的不同之处

一.条件判断: php中算  false 的情况 1. boolean:false 2. 整形:0 3.浮点型:0 4.字符串:"" "0"(其他都对) 5.空数组 6.空对象为真(只在php4算false,其他版本都算true) 7.null和尚未定义的变量 8.所有资源都算对,除php4,所有对象也算对 JS中if()中的表达式 1. Boolean: true 真 false 假 2. String:非空字符串为真 空字符串为假 3. Null/NaN/Und

C语言写猜拳游戏中遇到的函数循环小问题

各位可能在初学C语言的时候都有写过猜拳游戏.但在写猜拳的函数时,避免不了会使用循环. 当函数被套在一个循环中的时候,你的计分变量可能就会被重置为函数体里的初始值.那么怎么解决这个问题? 其实很简单,你需要在循环体中加入一个累加变量,从而使得函数体的单循环计分通过main函数里的循环成为最后的总积分,并且由此来判断最终你的积分和输赢. 以下是我写的部分代码 ,欢迎指正! 1.函数体部分 int compare(int x,int y){ int j = 0;//函数外的每次循环会使得j的值初始化

Python中的判断、循环 if...else,while

if...else语句: a=3; b=3; if a == b :print(a,b)elif a <= b :print(str(a) + " is less than " + str(b))else :print(str(a) + " is greater than " + str(b)) ################################### n = 3if (n >= 0 and n <= 8) or (n >= 1

tp模版中使用js变量 和 循环为空判断

今天花费较长时间解决了两个问题,记下来. 都和这个语句有关: for(i in data){ str += '<div class="huodong">'; str += '<a href="{:U("details",array("id"=>" '+data[i].id+' "))}">'; if(data[i].line_pic !=null){ str += '<i

中值滤波C语言优化

中值滤波C语言优化 图像平滑是图像预处理的基本操作,本文首先用不同的方法对一张图片做预处理比较它们效果的不同,然后针对中值滤波,实现了一种快速实现.(其实是copy的opencv实现,呵呵).因为opencv的实现方法感觉太好了,今天就特别写下来.既有备忘的作用,同时如果谁看到这篇文章,也可以借鉴下opencv的实现.   1 原始图像 2 均值滤波图像 3 中值滤波图像 4 双边滤波图像 5 高斯滤波图像     上图的代码 void CDialogTest2013Dlg::OnBnClick