有人對著組合語言不夠一屑,認為那已經是古老的低階語言,是當今的非主流語言,學了也不知道有什麼用。是的,我們不得不承認,作為一門古老的語言,彙編已經完成了歷史賦予它的使命,但是我們知道,我們現在所使用的任何高階語言在編譯的時候都是被轉化為組合語言來執行的,也就是說,無論我們在上層做了何種的抽象,引入了多少新鮮的概念,作為乙個程式設計師,我們的程式在最底層仍然是它,或許絕大部分的時間,我們無需關心它的存在,但是,當我們編寫或優化高效能的應用程式時,除了演算法,我們也不得不面對它。下面我們來舉乙個例子來證明這一點,我們用c/c++ 寫兩個簡單巢狀迴圈:
1). for ( i= 0; i < 1000000; i++)
for (j =0; j < 100; j++)
2). for ( i= 0; i < 100; i++)
for (j =0; j < 1000000; j++)
我們知道,當計算表示式相同時,這兩個迴圈所計算得到的結果完全相同,但是你會選擇哪一種寫法呢?或許絕大多數的程式設計師壓根就沒有想過要會有第二種寫法,因為他的程式都來自他的邏輯(作為人的一種自然邏輯),而不是「機器」的邏輯,呵呵,是的,我們在寫程式,是執行在機器上的程式,所以我們在寫程式時,就應該盡量遵循「機器」的邏輯,那樣的話,我們就能寫出高效能的程式,為什麼要第2 種寫法要優於第1種寫法呢?下面讓我們來看一看他關鍵彙編**描述就明白了(呵呵,終於用到彙編了):
1.mov cx,0
a: cmp cx, 1000000
jg over
inc cx
mov bx , 0
b: cmp bx, 100
jg a
inc bx
some calculate……
jump b
over:
2. mov cx,0
a: cmp cx, 100
jg over
inc cx
mov bx , 0
b: cmp bx, 1000000
jg a
inc bx
some calculate……
jump b
over:
那麼我們怎麼去評估我們的兩個**的效能呢?
1.在這裡我們就去看jump指令,在第乙個彙編**中,我們去評估jg a指令和 jump b 指令,也就是說,正常情況下,jg a被執行了1000,000次,而jump b 指令被執行了 100* 1000,000次,現在讓我們來看看第二個彙編**中的jg a指令和 jump b 指令分別執行的次數,在正常情況下,我們很容易就得知,jg a被執行了100次,而jump b 指令被執行了 100* 1000,000次,也就是說,在兩個**中,jump b 指令被執行的次數相等,而在第二段**中jg a指令執行的次數比第一段**中執行的次數少1000,000次,假設我們的程式執行在pentium 機上,那麼乙個jump指令大概執行的乙個時鐘迴圈(clock cycle),那麼,很明顯,第二段**的執行效率要高於第一段時鐘的執行效率。
2.其實再仔細分析,可知如下:
a: cmp cx, 1000000
jg over
inc cx
mov bx , 0
和a: cmp cx, 100
jg over
inc cx
mov bx , 0
執行的次數分別是執行了1000,000和100遍,可想而知哪乙個效能高了;
上述只是乙個很常見的例子,有時候,為了使效能達到我們的要求,我們要優化**,關鍵的部分部分通常利用彙編**去實現,因為使用特定的cpu提供的特殊的指令集通常能大大提高程式的效能(但是,可移植性通常也因此而被犧牲)。
所以,要成為高手,學習彙編是必要的,因為,彙編能讓你在除錯你程式的時候更加游刃有餘,能讓你深入底層,找出很難察覺的bug,讓你更加懂得「機器思維」。而這一切,都是成為高手的必要條件。
多重迴圈效能優化
迴圈次數較多,迴圈層數較多時,程式效率問題非常明顯。優化後的多重for迴圈可以提公升大半的效率。一 例項化變數盡量放在for迴圈體外,只例項化一次。二 普通變數改為暫存器變數,如i 改為 i。前置遞增運算避免了不必要的工作,它把值加1後直接返回改變了運算物件本身。三 條件比較使用 要快於 同理 要快...
Java 迴圈效能分析
最近coding的時候對迴圈的效能很好奇,面對多種迴圈方式,迭代器 for迴圈 foreach迴圈 lambda的foreach迴圈。如果單論 美觀,個人偏向於lambda的foreach迴圈和foreach迴圈。但是這樣唐突的選擇很有可能造成效能的下降。後面本人就分析了一下各個迴圈之間的效率 一 ...
java中for迴圈效能的優化 一
for 迴圈效能測試 多層for迴圈的巢狀順序 由於cpu在內外之間的切換會有一定的開銷,因此如果可能的話,應該盡可能較少內外層迴圈切換的次數.只需使最外層迴圈的次數最少,內層迴圈次數多即可.若觀點有誤請大神們多多指教 public class test2 long endtime1 system....