esp32 c3芯片介绍乐鑫信息科技代理商C语言程序优化,速度、成本和功耗是衡量计算机系统性能的重要指标。硬件和软件因素影响计算机系统的性能。在硬件方面,通过改进处理器、存储器和I/0 设备的结构和工艺可提高器件的性能。在软件方面,通过改进算法和优化程序,可提高程序的性能。
程序优化是嵌入式系统软件开发过程中的重要环节。对于esp32 c3芯片介绍乐鑫信息科技代理商嵌入式系统,除了提高速度和减少存储资源需求外,降低系统能耗也是优化的重要目标。
什么是优化
优化指在不改变程序功能的情况下,根据处理器及系统的特点,通过修改原始程序中的算法、结构,或利用软件开发工具对程序进行改进,使修改后的程序运行速度更快,占用空间更小或能耗更低。
不同的程序优化目标之间有时是相辅的,例如,减少程序中的指令数量,可以同时提高程序运行速度和节约存储空间;有时是相悖的,例如,取消内联函数能够缩短程序的长度,但降低程序运行的速度。
算法优化和程序结构优化是常用的程序优化方法。esp32 c3芯片介绍乐鑫信息科技代理商算法优化,即用功能相同效率更好的算法代替传统算法。例如,快速排序算法比有泡算法速度快,FFT 比普通 DFT 速度快。
程序结构优化,即根据处理器特点通过修改程序中的数据类型和数据结构,改进流程等手段,提高程序运行的效率,减少程序所需的存储资源。
程序速度优化
esp32 c3芯片介绍乐鑫信息科技代理商通过改变程序结构、流程和语句,减少程序运行时处理器实际执行的指令数,以而减少程序运行的总时间。
1.数据类型优化
在示例 8.5 中,(a)函数中 sum 的类型为 int,函数返回的类型是 int,两者数据类型相同。(b)函数中 sum 的类型为 int,函数返回的类型是 short,两者数据类型不一致。
对照(a)和(b)编译后生成的汇编语句,(b)比(a)增加了两条指令。可见,当函数返回类型与函数内变量数据类型不一致时,将增加转换数据类型带来的开销。
示例8.5:返回数据类型的影响。
(a)
/*
int checksum(int * data)
{
int i;
int sum = 0;
for(i= 0;i<64;i++)
{
sum += data[i];
}
}
return sum;
}
*/
Checksum
addi a3,a0,256
li a5,0
.L2 :
Iw a4,0(a0)
add a5 ,a5 , a4
addi a0,a0,4
bne a0 ,a3,.L2
jr ra
-------------------------------------------------------------------------------
(b)
/*
short checksum(int * data)
{
int i;
int sum = 0;
for(i= 0;i<64;i++ )
{
sum += data[i];
}
return sum;
}
*/
checksum:
addi a3,a0,256
li a5,0
.L2 :
lw a4,0(a0)
add a5 ,a5 ,a4
addi a0 ,a0 ,4
bne a0 ,a3 ,.L2
slli a0,a5,16
srai a0,a0,16
jr ra
在示例 8.6 中,(a)和(b)是功能相同的 RV32I函数,(a)中函数参数和返回数据的类型是 int,(b)中函数参数和返回类型是 short。esp32 c3芯片介绍乐鑫信息科技代理商通过对比,(b)中多了 5 条指令。(b)中数据类型与处理器字宽不相同。因此,在不影响数据结果时,选择与处理器字宽相同的数据类型,可以减少编译后的指令数。
示例8.6: 变量类型的影响。
(a)
/*
int checksum(int a)
{
return a+ 10;
}*/
checksum:
addi sp,sp,-16
Sw a0,12(sp)
lw a5,12(sp)
Addi a5,a5,10
Mv a0,a5
Addi sp,sp,16
Jr ra
--------------------------------------------------------
(b)
/*
Short checksum(short)
{
Return a+ 10;
}
*/
checksum:
Addi sp,sp,-16
Mv a5,a0
Sh a5,14(sp)
Lhu a5,14(sp)
Addi a5,a5,10
Slli a5,a5,16
Srli a5,a5,16
Srai a5,a5,16
Mv a0,a5
Addi sp,sp,16
Jr ra
2.计算替换
不同计算方法(公式)对计算资源的需求有所差别。esp32 c3芯片介绍乐鑫信息科技代理商在不改变计算结果的前提下,选择计算量较小的方法,能够提高程序运行速度。在示例 8.7 中,程序(b)用逻辑运算“&”替换程序(a)中的取余数运算“%”,减少了指令数和计算时间。
示例8.7:运算替换
(a)
/*
int checksum( int a)
{
int b=0;
b=a%7;
return b;
}*/
checksum:
addisp,sp,- 32
sw a0,12(sp)
Sw zero,28(sp)
Lw a4,123(sp)
Li a5,7
rem a5,a4,a5
Sw a5,28(sp)
Lw a5,28(sp)
Mv a0,a5
Addi sp,sp,32
Jr ra
------------------------------------------------
(b)
/*
int checksum(int a)
{
int b= 0;
b = a&7;
return b;
}*/
Checksum:
Addi sp,sp,-32
Sw a0,12(sp)
Sw zero,28(sp)
Lw a5,12(sp)
Andi a5,a5,7
Sw a5,28(sp)
Mv a0,a5
Addi sp,sp,32
Jr ra
示例 8.7 中,C语言编译后生成的汇编程序(b)比(a)少 1 条指令。另外,(b)中指令“andi”比(a)中指令“rem”执行时间短。由于 RISC-V RV32IM 支持求余数运算指令,本例的优化效果不够突出。但对于不支持除法运算指令的处理器,求余数计算所用的指令数远远超过“与”运算。
通常,小数被编译器默认为双精度 double 型数据。将小数显式转换成 float型可提高运行速率。例如,把“3.14”改成“3.14f”。另外,esp32 c3芯片介绍乐鑫信息科技代理商常用的运算替换方法还有用乘法运算替换除法运算、用乘法运算替代指数运算等。