1.時間與空間問題
在嵌入式領域,我們經常會遇到時間和空間上的問題, 有的是即時性要求比較高的那麼就需要利用空間來換取時間,
方法A:
#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,“This is a example!!”);
方法B:
const char string2[LEN] =“This is a example!”;
char * cp;
cp = string2 ;
雖然這種方法必要笨拙,缺乏靈活性,但在特殊的情況下效率是比較高的.
2.宏的問題
一般情況下,不建議使用宏,因為宏破壞了程式的可讀性,特別是代碼中潛入很多宏的時候排錯就很麻煩! 但是如果在特殊的情況下,比如追求效率的情況下還是可以使用一下, 在一般情況下我們還是將這個工作交給編譯起來完成, 因為現代的編譯器會自動的把小函數或內嵌函式擴充為宏.(我一般只用宏來進行定義常數, 條件編譯工作).
3.採用數學的方法來最佳化程式
有時候這個問題常常被大家忽略, 對於沒有沒有經驗的程式員來說更是如此, 然而這個對效率的差別是巨大的,一個經典的例子就是:
求 1~100的和。
方法A:
int I , j;
for (I = 1 ;I<=100; I ++)
{
j += I;
}
方法B:
int I;
I = (100 * (1+100)) / 2
很顯然這裡的差別也是巨大的, 方法B的代碼也更簡潔, 呵呵^_^,所以程式員數學不好那也是限制發展的一個因素!
4.使用位操作來代替乘法和除法
大家都知道乘法和除法在cpu中是不能直接進行的, cpu採用加法來現, 所以在適當的情況下我們要使用位移來實現乘法和除法.如
a=211/4; 也可以寫成a=211>>2;(這裡的適當時候,當然是運算式不是很複雜的時候, 如果需要都用位移來操作,那麼調程式的時候會痛苦死的^_^)!
5.彙編潛入
大家都知道在電腦裡,彙編是跑的最快的程式語言, 使用彙編可以時程式的效率提高一定的數量級, 但是所謂事物的兩面性, 使用彙編也減低的程式的可移植性, 而且很可能對程式造成巨大的破壞.建議是高手使用,而且也僅僅限與底層處理或效能要求非常苛刻的時候.如:
char string1[1024],string2[1024];
方法I
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I)
方法J
#ifdef _PC_
int I;
for (I =0 ;I<1024;I++)
*(string2 + I) = *(string1 + I);
#else
#ifdef _ARM_
__asm
{
MOV R0,string1
MOV R1,string2
MOV R2,#0
loop:
LDMIA R0!, [R3-R11]
STMIA R1!, [R3-R11]
ADD R2,R2,#8
CMP R2, #400
BNE loop
}
#endif
注:這裡的例子代碼都載之www.vckbase.com網站!