雖然,這些使用方法看似差別不大,在現在的cpu執行期起來幾乎上可以忽略不計,
但是,我們想一下現在軟體,每乙個都是那麼的龐大,乙個小專案都是幾萬行**,
乙個函式中你消耗一點,那麼多函式是很大的效能消耗的。舉乙個不恰當的例子,
下面的例子是我在虛擬機器中執行,其中也會有機器效能不好的原因,但是我覺得這樣才會將問題展示的更加的嚴重。
1.不要將函式作為迴圈的條件
size= 1024
program 1: time:29ms
p = &a;
for( ; i < size*sizeof(int); i++)
program 2:
time:1ms
p = &a;
len = size*sizeof(int);
for( ; i < len; i++)
原因:因為每次比較條件,函式都需要重新計算的,將會消耗時間。
2. 減少記憶體訪問次數
program:1 time:1ms
i = 0;
for( ; i < 1024; i++)
tmp ++;
program:2 time:7ms
i = 0;
for( ; i < 1024; i++)
tmp = tmp + 1;
原因:記憶體與cpu的頻率差別很大,儘量減少cpu對記憶體的訪問,減少變數引用;
3.去除不必要的分支
program:1 time:3ms
i = 0;
for (tmp = 0; tmp < 100; tmp++)
} program:2 time:2ms
i = 0;
for (tmp = 0; tmp < 100; tmp++)
} 4.間接定址比基位址定址慢,所以將結構體中常用的成員放前面,並且放在一起。(類、介面、檔案同理)
program 1: time:11ms
i = 0;
for( ; i < 1000; i++)
program 1: time:7ms
i = 0;
for( ; i < 1000; i++)
原因:將資料放到同一記憶體頁中,減少頁面切換,增加快取的命中率。
c語言陣列清空的幾種方法比較
#define max 1024
方法一
for( k = 0 ; k <10000 ; k++ )
for( i = 0 ; ifor( j = 0;j < max; j++ )
a[i][j] = 0;
方法二for( k = 0 ; k < 10000; k++ )
for( i = 0 ; ifor( j = 0;j < max; j++ )
a[j][i] = 0;
方法三int *p;
for( k = 0 ; k < 10000; k++ )
}
方法四
int *p;
for( k = 0 ; k < 10000; k++ )
}
方法五
int *p;
for( k = 0 ; k < 10000; k++ )
}
r-
方法六
for( k = 0 ; k < 10000; k++ )
JAVA 繼承需要注意的細節
1 子類的構造過程中 必須 呼叫基類的構造方法 原因 可以這樣理解,每個子類都有 super 屬性 而該屬性指向的是父類物件 在例項化子類物件時 子類的構造方法會預設的去呼叫一次父類的構造方法 目的是為了生成乙個父類物件 並讓 super 指向該物件 這種說法只是我自己理解的,雖然不清楚是為什麼,但...
Android開發過程中需要注意的細節
git 使用 rebase 命令來合併分支,盡量不要直接 merge 導致分支 日誌混亂。開發新功能時,自己在本地建立 feature 分支開發,功能開發完畢之後,參照上面合併流程操作功能的合併,並刪除本地分支,注意不要將本地分支推送到伺服器。平時開發只在 develop 分支和自己的本地分支操作,...
MTK NVRAM 需要注意的一點細節
在mtk讀寫nvram的時候要指定total和size 比如下面的 define nvram srs adjust total 4 define nvram srs adjust size sizeof nvram srs adjust setting s 需要特別注意的是其中的 nvram cat...