Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net
Atitit.提升軟件Web應用程序 app性能的方法原理 h5 js java c# php python android .net
?
1. 提升單例有能力的1
2. 減少工作數(shù)量2
2.1. 減少距離2
2.2. 添加索引2
2.3. Dma api2
2.4. Cdn2
2.5. Cache2
2.6. Pool技術2
2.7. 減少HTTP請求數(shù)2
2.8. ?·更大的數(shù)據(jù)格式2
2.9. 循環(huán)展開2
2.10. 循環(huán)轉(zhuǎn)置3
2.11. 提高Cache命中率3
2.12. 小組件替換大組件4
3. 并行處理4
3.1. 多線程4
3.2. 數(shù)據(jù)庫分區(qū)4
4. 減少等候4
4.1. ?2、流水線(Pipeline)4
4.2. 亂序執(zhí)行---相關5
4.3. 分支預測5
4.4. 靜態(tài)指令調(diào)度and 動態(tài)指令調(diào)整5
4.5. 運算順序調(diào)整6
5. 預準備好6
5.1. 查表法6
5.2. 預加載6
6. Lazy load6
6.1. 延時腳本 6
7. 參考6
?
?
1.?提升單例有能力的
?
2.?減少工作數(shù)量
2.1.?減少距離
2.2.?添加索引
2.3.?Dma api
2.4.?Cdn
2.5.?Cache
2.6.?Pool技術
2.7.?減少HTTP請求數(shù)
2.8.??·更大的數(shù)據(jù)格式
如今的?64?位處理器是當初的?4?位處理器長期演變的結(jié)果。每次轉(zhuǎn)變都使得處理更大的數(shù)據(jù)元素速度更快,并支持處理器直接尋址更大的內(nèi)存。這些先進特性對于性能的提升和能力上的擴充是十分關鍵的,而沒有這些先進特性,今天的數(shù)據(jù)密集型應用將難以想像。
對比一下可發(fā)現(xiàn),32?位處理器可直接尋址高達?4 GB?的內(nèi)存;而?64?位處理器理論上則可尋址高達約?1,800?萬?TB的內(nèi)存(實際尋址容量取決于具體部署)。這是一次巨大的飛躍,很可能需要經(jīng)過一段時間以后,硬件及軟件開發(fā)人員才能充分利用那些他們現(xiàn)在已經(jīng)能夠利用的較大尋址空間。
作者::??★(attilax)>>>???綽號:老哇的爪子?(?全名::Attilax?Akbar?Al?Rapanui?阿提拉克斯?阿克巴?阿爾?拉帕努伊?)?漢字名:艾龍,??EMAIL:1466519819@qq.com
轉(zhuǎn)載請注明來源:?http://blog.csdn.net/attilax
?
2.9.?循環(huán)展開
循環(huán)展開將兩個或更多個循環(huán)迭代合并到一起,以減少循環(huán)計數(shù)。循環(huán)展開雖然常常會導致代碼長度增加,但它可以減少必須執(zhí)行的指令數(shù)。下面是一個非常簡單的循環(huán)展開示例,它從循環(huán)中刪除了一個分支:?
這是經(jīng)典的速度優(yōu)化,但許多編譯程序(如gcc -funroll-loops)能自動完成這個事,所以現(xiàn)在你自己來優(yōu)化這個顯得效果不明顯。
不過注意:對于中間變量或結(jié)果被更改的循環(huán),編譯程序往往拒絕展開,(怕?lián)熑螁h),這時候就需要你自己來做展開工作了.
還有一點請注意,在有內(nèi)部指令cache的CPU上(如MMX芯片),因為循環(huán)展開的代碼很大,往往cache溢出,這時展開的代碼會頻繁地在CPU?的cache和內(nèi)存之間調(diào)來調(diào)去,又因為cache速度很高,所以此時循環(huán)展開反而會變慢.還有就是循環(huán)展開會影響矢量運算優(yōu)化。
在最內(nèi)層循環(huán)避免使用全局變量和靜態(tài)變量,除非你能確定它在循環(huán)周期中不會動態(tài)變化,大多數(shù)編譯器們優(yōu)化變量僅有置成寄存器變量一招,而對于動態(tài)變量,它們干脆放棄對整個表達式的優(yōu)化.
2.10.?循環(huán)轉(zhuǎn)置
有些機器對JNZ(為0轉(zhuǎn)移
有些機器對JNZ(為0轉(zhuǎn)移)有特別的指令處理,速度非常快,如果你的循環(huán)對方向不敏感,可以由大向小循環(huán)。
舊代碼:
?????for (i = 1; i <= MAX; i++)
??? {
??????? ...
??? }
新代碼:
????i = MAX+1;
??? while (--i)
??? {
??????? ...
??? }
不過千萬注意,如果指針操作使用了i值,這種方法可能引起指針索引超界的嚴重錯誤(i = MAX+1;).當然你可以通過對i做加減運算來糾正,但是這樣加速的作用就沒有了除非類似于以下情況
?
?
2.11.?提高Cache命中率
?
·數(shù)組合并·循環(huán)交換·循環(huán)合并
·分塊
集中訪問可取入cache的塊狀矩陣,避免全行或全列的讀寫,以增強時間局部性。
?
2.12.??小組件替換大組件
Bootstrap ?替換 amazeui
?
?
?
?
?
3.?并行處理
3.1.?多線程
3.2.?數(shù)據(jù)庫分區(qū)
?
4.?減少等候
4.1.??2、流水線(Pipeline)
流水線是現(xiàn)代RISC核心的一個重要設計,它極大地提高了性能。
對于一條具體的指令執(zhí)行過程,通常可以分為五個部分:取指令,指令譯碼,取操作數(shù),運算(ALU),寫結(jié)果。其中前三步一般由指令控制器完成,后兩步則由運算器完成。按照傳統(tǒng)的方式,所有指令順序執(zhí)行,那么先是指令控制器工作,完成第一條指令的前三步,然后運算器工作,完成后兩步,在指令控制器工作,完成第二條指令的前三步,在是運算器,完成第二條指令的后兩部……很明顯,當指令控制器工作是運算器基本上在休息,而當運算器在工作時指令控制器卻在休息,造成了相當大的資源浪費。解決方法很容易想到,當指令控制器完成了第一條指令的前三步后,直接開始第二條指令的操作,運算單元也是。這樣就形成了流水線系統(tǒng),這是一條2級流水線。
?
?
4.2.?亂序執(zhí)行---相關
在一個流水線系統(tǒng)中,如果第二條指令需要用到第一條指令的結(jié)果,這種情況叫做相關。以上面哪個5級流水線為例,當?shù)诙l指令需要取操作數(shù)時,第一條指令的運算還沒有完成,如果這時第二條指令就去取操作數(shù),就會得到錯誤的結(jié)果。所以,這時整條流水線不得不停頓下來,等待第一條指令的完成。這是很討厭的問題,特別是對于比較長的流水線,比如20級,這種停頓通常要損失十幾個時鐘周期。目前解決這個問題的方法是亂序執(zhí)行。亂序執(zhí)行的原理是在兩條相關指令中插入不相關的指令,使整條流水線順暢。比如上面的例子中,開始執(zhí)行第一條指令后直接開始執(zhí)行第三條指令(假設第三條指令不相關),然后才開始執(zhí)行第二條指令,這樣當?shù)诙l指令需要取操作數(shù)時第一條指令剛好完成,而且第三條指令也快要完成了,整條流水線不會停頓。當然,流水線的阻塞現(xiàn)象還是不能完全避免的,尤其是當相關指令非常多的時候。
?
?
一般來說,當一條語句計算出來的值,后續(xù)語句不要理解使用,需要隔幾條語句(通常為4條語句)后再使用前面計算得出的值,這是因為流水線原因,當前面的值計算比較費時,后面的指令就不能執(zhí)行,流水線就會被阻塞,有些編譯器可以優(yōu)化,采用亂序執(zhí)行方式,讓計算語句后面的指令在不等計算語句完成前接著執(zhí)行,這樣就能夠保證流水線的平滑。
?
4.3.?分支預測
?
轉(zhuǎn)移
另一個大問題是條件轉(zhuǎn)移。在上面的例子中,如果第一條指令是一個條件轉(zhuǎn)移指令,那么系統(tǒng)就會不清楚下面應該執(zhí)行那一條指令?這時就必須等第一條指令的判斷結(jié)果出來才能執(zhí)行第二條指令。條件轉(zhuǎn)移所造成的流水線停頓甚至比相關還要嚴重的多。所以,現(xiàn)在采用分支預測技術來處理轉(zhuǎn)移問題。雖然我們的程序中充滿著分支,而且哪一條分支都是有可能的,但大多數(shù)情況下總是選擇某一分支。比如一個循環(huán)的末尾是一個分支,除了最后一次我們需要跳出循環(huán)外,其他的時候我們總是選擇繼續(xù)循環(huán)這條分支。根據(jù)這些原理,分支預測技術可以在沒有得到結(jié)果之前預測下一條指令是什么,并執(zhí)行它。現(xiàn)在的分支預測技術能夠達到90%以上的正確率,但是,一旦預測錯誤,CPU仍然不得不清理整條流水線并回到分支點。這將損失大量的時鐘周期。所以,進一步提高分支預測的準確率也是正在研究的一個課題。
越是長的流水線,相關和轉(zhuǎn)移兩大問題也越嚴重,所以,流水線并不是越長越好,超標量也不是越多越好,找到一個速度與效率的平衡點才是最重要的。
?
4.4.?靜態(tài)指令調(diào)度and 動態(tài)指令調(diào)整
?
4.5.?運算順序調(diào)整
通常的算法設計和程序?qū)崿F(xiàn)中,人們習慣在需要某數(shù)據(jù)的地方才計算出該數(shù)據(jù)的值,緊接著使用該數(shù)據(jù)。這是很自然的思維習慣,但對于流水線則會造成麻煩。
兩個運算相繼進行,但后一個運算需要的操作數(shù)還沒有被計算出來,只有原地等待,造成了流水線的停滯。
?
5.?預準備好
5.1.?查表法
5.2.?預加載
?
6.?Lazy load
6.1.?延時腳本
7.?參考
提升Web應用程序性能的最佳實踐-CSDN.NET.html
[分享]提升系統(tǒng)性能方法初步探討 - 軟件行業(yè) - 暢享論壇.html
轉(zhuǎn)載于:https://www.cnblogs.com/attilax/p/5963375.html
總結(jié)
以上是生活随笔為你收集整理的Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA, 580 Critical Ma
- 下一篇: 人工神经网络基本特点