拆解循环-以空间换时间
在编写循环处理程序的时候要充分利用CPU的指令缓存,要充分分解小的循环。特别是当循环体本身很小的时候,分解循环可以提高性能。
这里要注意,很多编译器并不能自动分解循环。不好的代码:
// 3D转化:把矢量 V 和 4x4 矩阵 M 相乘
for (i = 0;i < 4;i ++)
{
r[i] = 0;
for (j = 0;j < 4;j ++)
{
r[i] += M[j][i]*V[j];
}
}
推荐的代码:
r[0] = M[0][0]*V[0] + M[1][0]*V[1] + M[2][0]*V[2] + M[3][0]*V[3];
r[1] = M[0][1]*V[0] + M[1][1]*V[1] + M[2][1]*V[2] + M[3][1]*V[3];
r[2] = M[0][2]*V[0] + M[1][2]*V[1] + M[2][2]*V[2] + M[3][2]*V[3];
r[3] = M[0][3]*V[0] + M[1][3]*V[1] + M[2][3]*V[2] + M[3][3]*v[3];
02
充分提取循环中的公共部分
对于一些不需要循环变量参加运算的任务可以把它们放到循环外面,这里的任务包括表达式、函数的调用、指针运算、数组访问等,应该将没有必要执行多次的操作全部集合在一起,放到一个init的初始化程序中进行。
03
延时函数中的循环技巧
通常使用的延时函数均采用自加的形式:
void delay (void)
{
unsigned int i;
for (i=0;i< 1000;i++) ;
}
将其改为自减延时函数:
void delay (void)
{
unsigned int i;
for (i=1000;i >0;i--) ;
}
两个函数的延时效果相似,但几乎所有的C编译对后一种函数生成的代码均比前一种代码少13个字节,因为几乎所有的MCU均有为0转移的指令,采用后一种方式能够生成这类指令。在使用while循环时也一样,使用自减指令控制循环会比使用自加指令控制循环生成的代码更少13个字母。
但是,在循环中有通过循环变量“i”读写数组的指令时,使用预减循环有可能使数组超界,要引起注意。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
C语言
+关注
关注
180文章
7604浏览量
136813 -
程序
+关注
关注
117文章
3787浏览量
81038 -
编译器
+关注
关注
1文章
1634浏览量
49129
发布评论请先 登录
相关推荐
C语言中for循环的用法和应用 C语言中for循环与while循环的区别
C语言中的循环结构时,for循环是最常用的一种。它允许重复执行一段代码,直到满足特定条件为止。
发表于 08-18 16:33
•3254次阅读
C语言入门教程-if语句和while循环
if语句和while循环
C语言中,if语句和while循环都会用到布尔表达式。下面是一个使用if语句的简单例子:
#include
发表于 07-29 10:48
•8552次阅读
c语言在while中嵌套if循环
C语言是一种广泛使用的面向过程编程语言,它提供了许多控制结构来帮助程序员实现复杂的逻辑和流程控制。其中,while循环和if语句是非常常见和重要的控制结构。本文将详细介绍
评论