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芯片介紹樂鑫信息科技代理商常用的運算替換方法還有用乘法運算替換除法運算、用乘法運算替代指數運算等。