-
當(dāng)前位置:首頁(yè) > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
前端頁(yè)面性能優(yōu)化(前端頁(yè)面性能優(yōu)化指標(biāo)有哪些)
大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于前端頁(yè)面性能優(yōu)化的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。
開(kāi)始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請(qǐng)撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、常用的前端性能優(yōu)化方法有哪些?
1、減少http請(qǐng)求,合理設(shè)置 HTTP緩存
2、使用瀏覽器緩存
3、啟用壓縮
4、CSS Sprites,合并 CSS圖片,減少請(qǐng)求數(shù)
5、CSS放在頁(yè)面最上部,javascript放在頁(yè)面最下面
前端對(duì)于網(wǎng)站來(lái)說(shuō),通常是指,網(wǎng)站的前臺(tái)部分包括網(wǎng)站的表現(xiàn)層和結(jié)構(gòu)層。因此前端技術(shù)一般分為前端設(shè)計(jì)和前端開(kāi)發(fā),前端設(shè)計(jì)一般可以理解為網(wǎng)站的視覺(jué)設(shè)計(jì),前端開(kāi)發(fā)則是網(wǎng)站的前臺(tái)代碼實(shí)現(xiàn),包括基本的HTML和CSS以及JavaScript/ajax,現(xiàn)在最新的高級(jí)版本HTML5、CSS3,以及SVG等。
二、瀏覽器層合成與頁(yè)面性能優(yōu)化
一個(gè)web頁(yè)面由多層構(gòu)成的
比如掘金:
瀏覽器渲染頁(yè)面
在編寫頁(yè)面中,我們要知道瀏覽器如何處理 HTML、JavaScript 和 CSS。 需要了解并注意五個(gè)主要區(qū)域, 這些我們擁有控制權(quán)的部分,也是像素至屏幕管道中的關(guān)鍵點(diǎn)。
每一步簡(jiǎn)介
• JavaScript。 一般來(lái)說(shuō),我們會(huì)使用 JavaScript 來(lái)實(shí)現(xiàn)一些視覺(jué)變化的效果。比如用 jQuery 的 animate 函數(shù)做一個(gè)動(dòng)畫、對(duì)一個(gè)數(shù)據(jù)集進(jìn)行排序或者往頁(yè)面里添加一些 DOM 元素等。當(dāng)然,除了 JavaScript,還有其他一些常用方法也可以實(shí)現(xiàn)視覺(jué)變化效果,比如:CSS Animations、Transitions 和 Web Animation API。• 樣式計(jì)算。 此過(guò)程是根據(jù)匹配選擇器(例如 .headline 或 .nav > .nav__item)計(jì)算出哪些元素應(yīng)用哪些 CSS 規(guī)則的過(guò)程。從中知道規(guī)則之后,將應(yīng)用規(guī)則并計(jì)算每個(gè)元素的最終樣式。• 布局。 在知道對(duì)一個(gè)元素應(yīng)用哪些規(guī)則之后,瀏覽器即可開(kāi)始計(jì)算它要占據(jù)的空間大小及其在屏幕的位置。網(wǎng)頁(yè)的布局模式意味著一個(gè)元素可能影響其他元素,例如 元素的寬度一般會(huì)影響其子元素的寬度以及樹(shù)中各處的節(jié)點(diǎn),因此對(duì)于瀏覽器來(lái)說(shuō),布局過(guò)程是經(jīng)常發(fā)生的。• 繪制。 繪制是填充像素的過(guò)程。它涉及繪出文本、顏色、圖像、邊框和陰影,基本上包括元素的每個(gè)可視部分。繪制一般是在多個(gè)表面(通常稱為層)上完成的。• 合成。 由于頁(yè)面的各部分可能被繪制到多層,由此它們需要按正確順序繪制到屏幕上,以便正確渲染頁(yè)面。對(duì)于與另一元素重疊的元素來(lái)說(shuō),這點(diǎn)特別重要,因?yàn)橐粋€(gè)錯(cuò)誤可能使一個(gè)元素錯(cuò)誤地出現(xiàn)在另一個(gè)元素的上層。
ps: 當(dāng)然,不是每一步更改都會(huì)遵循上圖這個(gè)流程。
每一步不是必經(jīng)的
比如:
•更改了元素的布局相關(guān)的屬性:width, height, 位置... 那么瀏覽器就會(huì)檢查其他元素,自動(dòng) 重排一次 。•更改了元素的 color, 陰影... 不會(huì)影響頁(yè)面的布局,那么瀏覽器就會(huì)跳過(guò)布局。這就是我們平常說(shuō)的:重排一定引起重繪,重繪不一定引起重排。•如果更改了 一個(gè)既不會(huì)布局,也不會(huì)繪制的屬性,那么瀏覽器直接跳到最后一步,不得不說(shuō),這是最高效的
使用 csstriggers[1] 可以詳細(xì)看到 css 屬性改變時(shí)觸發(fā)的流程。
如何提升繪制的性能
盡量使用影響較少的屬性
舉個(gè)🌰:
<div class="box box1">1</div><div class="box box2"> 2 </div> <script> const box1 = document.querySelector('.box1'); setTimeout(() => { box1.style.display = 'none' }, 3000); </script>
我們可以看到,box1 和 box2 都綠(重繪)了一次,說(shuō)明 box1 的變化影響了 box2。那這個(gè)屬性變化的代價(jià)是比較大的。
假如是我讓 box1 的位置 向右移動(dòng) 60px,我們做如下更改:
document.querySelector('.box1').style.transform = 'translateX(60px)';
現(xiàn)在 box2的位置不受影響,直觀地看到 box2是沒(méi)被綠(重繪)的。
提升為合成層(Compositing Layers)
我們?cè)谏弦徊阶隽藘?yōu)化,box2 已經(jīng)不受影響,但是box1 依然被重繪,那能不能在優(yōu)化呢。 答案是能的。 left 這個(gè)屬性的改變會(huì)造成的影響是:
layout -> painted -> composited
這個(gè)流程可以在 csstriggers[2] 看到。
那現(xiàn)在我們要找到一個(gè) css 屬性,既能讓元素位移,又能造成的影響最小。
答案是有的: transform:影響最小,直接到達(dá)最后一步 Composite 。 做如下更改:
box1.style.transform = 'translateX(60px)'
好像事與愿違。box1, box2 都被重繪了。
這里因?yàn)椋?#160; 他們都在一個(gè)層上,一個(gè)元素的變化也影響了其他元素。瀏覽器會(huì)聯(lián)合需要繪制的區(qū)域,而導(dǎo)致整個(gè)屏幕重繪。
為了直接到達(dá)最后一步 Composite 。其實(shí)這里有個(gè)條件: 更改屬性所在的元素應(yīng)處于其自身的合成層,如果沒(méi)在,我們可以提升為合成層` 這樣就不會(huì)影響其他元素,而能減少繪制區(qū)域。
提升為合成層的原因有一下幾種
這里我大概羅列了這么多
•video•有 3D transform•backface-visibility 為 hidden•對(duì) opacity、transform、fliter、backdropfilter 應(yīng)用了 animation 或者 transition(需要是 active 的 animation 或者 transition,當(dāng) animation 或者 transition 效果未開(kāi)始或結(jié)束后,提升合成層也會(huì)失效)•will-change 設(shè)置為 opacity、transform、top、left、bottom、right(其中 top、left 等需要設(shè)置明確的定位屬性,如 relative 等)•重疊原因
在 box1 上面做如下更改:
will-change: transform;
再次觀察效果:
大功告成:
•box1 不在重繪了•box2 不受影響 我們可以查看最終的分層效果:
和 ps 里面的圖層差不多,每一個(gè)圖層疊加在一起組成我們看到的網(wǎng)頁(yè)。
好處
提升為合成層簡(jiǎn)單說(shuō)來(lái)有以下幾點(diǎn)好處:
•合成層的位圖,會(huì)交由 GPU 合成,比 CPU 處理要快•當(dāng)需要 repaint 時(shí),只需要 repaint 本身,不會(huì)影響到其他的層•對(duì)于 transform 和 opacity 效果,不會(huì)觸發(fā) layout 和 paint
建議:
由于 transition animation 也有提升層的作用,所以動(dòng)畫可以優(yōu)先考慮 css3 動(dòng)畫。
物極必反
圖層越多越好嗎? 當(dāng)然不是。提升合成層也得 消耗額外的內(nèi)存和管理資源 ,
正所謂切勿提前優(yōu)化.
正如MDN所說(shuō): 如果你的頁(yè)面在性能方面沒(méi)什么問(wèn)題,則不要添加 will-change 屬性來(lái)榨取一丁點(diǎn)的速度。 will-change 的設(shè)計(jì)初衷是作為最后的優(yōu)化手段,用來(lái)嘗試解決現(xiàn)有的性能問(wèn)題.
參考
前端性能優(yōu)化之 Composite[3]
關(guān)鍵轉(zhuǎn)譯路徑 Critical Rendering Path[4]
will-change[5]
堅(jiān)持僅合成器的屬性和管理層計(jì)數(shù)[6]
最后
如果喜歡本篇文章,可以關(guān)注的微信公眾號(hào),如果不嫌煩,還可以把它添加到桌面😀。
References
[1] csstriggers: https://csstriggers.com/
[2] csstriggers: https://csstriggers.com/
[3] 前端性能優(yōu)化之 Composite: https://zhuanlan.zhihu.com/p/41472193
[4] 關(guān)鍵轉(zhuǎn)譯路徑 Critical Rendering Path: https://cythilya.github.io/2018/07/13/critical-rendering-path/#browser-rendering-pipeline
[5] will-change: https://developer.mozilla.org/zh-CN/docs/Web/CSS/will-change
[6] 堅(jiān)持僅合成器的屬性和管理層計(jì)數(shù): https://developers.google.com/web/fundamentals/performance/rendering/stick-to-compositor-only-properties-and-manage-layer-count
三、前端優(yōu)化-LCP
LCP是最大內(nèi)容繪制的簡(jiǎn)稱。LCP是用來(lái)測(cè)量感知加載速度。感知加載速度是以用戶為中心的重要指標(biāo)。因?yàn)樵擁?xiàng)指標(biāo)會(huì)在頁(yè)面的主要內(nèi)容基本加載完成時(shí),在頁(yè)面加載時(shí)間軸中標(biāo)記出相應(yīng)的點(diǎn),迅捷的LCP有助于讓用戶確信頁(yè)面時(shí)有效的。以前的指標(biāo)測(cè)量比如load(加載)或者DOMContentLoad(DOM內(nèi)容加載完畢)并不是很好,因?yàn)檫@些指標(biāo)并不一定與用戶看到的內(nèi)容相對(duì)應(yīng)。而向First Contentful Paint 首次內(nèi)容的繪制(FCP)這類以用戶為中心的新指標(biāo)只會(huì)捕獲加載最開(kāi)始的部分。如果某個(gè)頁(yè)面顯示時(shí)一段啟動(dòng)動(dòng)畫或者加載之時(shí),那么這些時(shí)刻與用戶的關(guān)聯(lián)性并不大。First Meaningful Paint 首次有效繪制(FMP)和Speed Index速度指數(shù)(SI),這些指標(biāo)能夠捕獲到更多初始后的加載速度,但是這些指標(biāo)復(fù)雜,難以理解,而且容易出錯(cuò)。
LCP指標(biāo)會(huì)根據(jù)頁(yè)面首次開(kāi)始加載的時(shí)間點(diǎn)來(lái)報(bào)告可視區(qū)域可見(jiàn)的最大圖像或者文本完成渲染的相對(duì)時(shí)間.良好的LCP的時(shí)間時(shí)2.5,較差的值為4.0s.最大內(nèi)容的繪制考量的元素類型為
報(bào)告給最大內(nèi)容繪制的元素大小通常時(shí)用戶在可視區(qū)域可見(jiàn)的大小,如果元素延伸到可視區(qū)域之外,或者任何元素被剪裁或者包含不可見(jiàn)的溢出,那么這部分不計(jì)入元素的帶線啊哦。對(duì)于在原始尺寸之上經(jīng)過(guò)調(diào)整的圖像元素,報(bào)告給指標(biāo)的元素大小為可見(jiàn)尺寸或者原始尺寸。
網(wǎng)頁(yè)通常時(shí)分階段加載的,因此,頁(yè)面上最大元素也可能會(huì)發(fā)生變化。為了應(yīng)對(duì)這種潛在的變化,瀏覽器會(huì)繪制第一幀立即發(fā)送一個(gè)largest-contentful-paint類型的PerformanceEntry,用于識(shí)別最大內(nèi)容元素,但是,在渲染后續(xù)幀之后,瀏覽器會(huì)在最大內(nèi)容元素發(fā)生變化時(shí)候分發(fā)另一個(gè)PerfornacneFanceEntry。需要主要的是,一個(gè)元素只能在渲染完成并且對(duì)用戶可見(jiàn)之后才視為最大元素,尚未加載點(diǎn)額元素不能視為渲染完成。在字體阻塞期使用網(wǎng)頁(yè)字體的文本節(jié)點(diǎn)也是這樣。在這種情況下,較小的元素可能會(huì)被報(bào)告稱最大元素,但一旦更大的元素完成渲染,就會(huì)通過(guò)另外一個(gè)PerformanceEntry對(duì)象進(jìn)行報(bào)告
為了使計(jì)算和分發(fā)新性能條目的性能開(kāi)銷保持在較低的水平,對(duì)元素大小或者位置的更改不會(huì)生成新的LCP候選對(duì)象,只有元素在可視區(qū)域的初始化大小和位置會(huì)納入考量范圍。也就是說(shuō),最初在屏幕外完成渲染,然后過(guò)濾到屏幕上的圖像可能不會(huì)得到報(bào)告,這也意味著最初可視區(qū)域內(nèi)進(jìn)行渲染,然后被推出到可視區(qū)域外的元素人講報(bào)告其在可視區(qū)域的初始化大小
LCP主要受四個(gè)因素影響
四、如何進(jìn)行網(wǎng)站性能優(yōu)化
一、前端優(yōu)化
網(wǎng)站性能優(yōu)化是一個(gè)很綜合的話題,涉及到服務(wù)器的配置和網(wǎng)站前后端程序等各個(gè)方面,我只是從實(shí)際經(jīng)歷出發(fā),分享一下自己所嘗試過(guò)的網(wǎng)站性能優(yōu)化方法。之所以在標(biāo)題上掛一個(gè)web2.0,是因?yàn)楸疚母赜谥行【W(wǎng)站的性能優(yōu)化,我所使用的系統(tǒng)也是典型web2.0的LAMP架構(gòu)。
首先講講前端的優(yōu)化,用戶訪問(wèn)網(wǎng)頁(yè)的等待時(shí)間,有80%是發(fā)生在瀏覽器前端,特別是頁(yè)面和頁(yè)面中各種元素(圖片、CSS、Javascript、 flash…)的下載之上。因此在很多情況下,相對(duì)于把大量的時(shí)間花在艱苦而繁雜的程序改進(jìn)上,前端的優(yōu)化往往能起到事半功倍的作用。雅虎最近將內(nèi)部使用的性能測(cè)試工具yslow向第三方公開(kāi),并發(fā)布了著名的網(wǎng)站性能優(yōu)化的十三條規(guī)則,建議你下載并安裝yslow,并作為測(cè)評(píng)網(wǎng)站優(yōu)化效果的工具。下面我挑其中特別有價(jià)值的具體說(shuō)明一下優(yōu)化的方法:
對(duì)于第一次訪問(wèn)您網(wǎng)站,尚未在瀏覽器cache中緩存您網(wǎng)站內(nèi)容的用戶,我們可以做的事情包括:
1)減少一個(gè)頁(yè)面訪問(wèn)所產(chǎn)生的http連接次數(shù)
對(duì)于第一次訪問(wèn)你網(wǎng)站的用戶,頁(yè)面所產(chǎn)生的http連接次數(shù)是影響性能的一個(gè)關(guān)鍵瓶頸。
對(duì)策:
- 盡量簡(jiǎn)潔的頁(yè)面設(shè)計(jì),最大程度減少圖片的使用,通過(guò)放棄一些不必要的頁(yè)面特效來(lái)減少javascript的使用。
- 使用一些優(yōu)化技巧,比如利用圖片的背景位移減少圖片的個(gè)數(shù);image map技術(shù);使用Inline images將css圖片捆綁到網(wǎng)頁(yè)中。
- 盡量合并js和css文件,減少獨(dú)立文件個(gè)數(shù)。
2) 使用gzip壓縮網(wǎng)頁(yè)內(nèi)容
使用gzip來(lái)壓縮網(wǎng)頁(yè)中的靜態(tài)內(nèi)容,能夠顯著減少用戶訪問(wèn)網(wǎng)頁(yè)時(shí)的等待時(shí)間(據(jù)說(shuō)可達(dá)到60%)。主流的web服務(wù)器都支持或提供gzip壓縮,如果使用apache服務(wù)器,只需要在配置文件中開(kāi)啟 mod_gzip(apache1.x)或mod_deflate(apache2.x)即可。凡是靜態(tài)的頁(yè)面,使用gzip壓縮都能夠顯著提高服務(wù)器效率并減少帶寬支出,注意圖片內(nèi)容本身已經(jīng)是壓縮格式了,務(wù)必不要再進(jìn)行壓縮。
3)將CSS放在頁(yè)面頂端,JS文件放在頁(yè)面底端
CSS的引用要放在html的頭部header中,JS文件引用盡量放在頁(yè)面底端標(biāo)簽的后面,主要的思路是讓核心的頁(yè)面內(nèi)容盡早顯示出來(lái)。不過(guò)要注意,一些大量使用js的頁(yè)面,可能有一些js文件放在底端會(huì)引起一些難以預(yù)料的問(wèn)題,根據(jù)實(shí)際情況適當(dāng)運(yùn)用即可。
4)使JS文件內(nèi)容最小化
具體來(lái)說(shuō)就是使用一些javascript壓縮工具對(duì)js腳本進(jìn)行壓縮,去除其中的空白字符、注釋,最小化變量名等。在使用gzip壓縮的基礎(chǔ)上,對(duì)js內(nèi)容的壓縮能夠?qū)⑿阅茉偬岣?%。
5)盡量減少外部腳本的使用,減少DNS查詢時(shí)間
不要在網(wǎng)頁(yè)中引用太多的外部腳本,首先,一次dns的解析過(guò)程會(huì)消耗20-120毫秒的時(shí)間;其次,如果在頁(yè)面中引用太多的外部文件(如各種廣告、聯(lián)盟等代碼),可能會(huì)因?yàn)橥獠课募捻憫?yīng)速度而將你的網(wǎng)站拖得很慢。如果不得不用,那么就盡量將這些腳本放在頁(yè)腳吧。不過(guò)有一點(diǎn)需要提及,就是瀏覽器一般只能并行處理同一域名下的兩個(gè)請(qǐng)求,而對(duì)于不同子的域名則不受此限制,因此適當(dāng)將本站靜態(tài)內(nèi)容(css,js)放在其他的子域名下(如 static.xxx.com)會(huì)有利于提高瀏覽器并行下載網(wǎng)頁(yè)內(nèi)容的能力。
對(duì)于您網(wǎng)站的經(jīng)常性訪問(wèn)用戶,主要的優(yōu)化思路就是最大限度利用用戶瀏覽器的cache來(lái)減少服務(wù)器的開(kāi)銷。
1)在header中添加過(guò)期時(shí)間(Expires Header)
在header中給靜態(tài)內(nèi)容添加一個(gè)較長(zhǎng)的過(guò)期時(shí)間,這樣可以使用戶今后訪問(wèn)只讀取緩存中的文件,而不會(huì)與服務(wù)器產(chǎn)生任何的交互。不過(guò)這樣做也存在一些問(wèn)題,當(dāng)圖片、CSS和js文件更新時(shí),用戶如果不刷新瀏覽器,就無(wú)法獲得此更新。這樣,我們?cè)趯?duì)圖片、css和js文件修改時(shí),必須要進(jìn)行重命名,才能保證用戶訪問(wèn)到最新的內(nèi)容。這可能會(huì)給開(kāi)發(fā)造成不小的麻煩,因?yàn)檫@些文件可能被站點(diǎn)中的許多文件所引用。flickr提出的解決辦法是通過(guò)url rewrite使不同版本號(hào)的URL事實(shí)上指向同一個(gè)文件,這是一個(gè)聰明的辦法,因?yàn)閡rl級(jí)別的操作效率是很高的,可以給開(kāi)發(fā)過(guò)程提供不少便利。
要理解為什么這樣做,必須要了解瀏覽器訪問(wèn)url時(shí)的工作機(jī)制:
a. 第一次訪問(wèn)url時(shí),用戶從服務(wù)器段獲取頁(yè)面內(nèi)容,并把相關(guān)的文件(images,css,js…)放在高速緩存中,也會(huì)把文件頭中的expired time,last modified, ETags等相關(guān)信息也一同保留下來(lái)。
b. 用戶重復(fù)訪問(wèn)url時(shí),瀏覽器首先看高速緩存中是否有本站同名的文件,如果有,則檢查文件的過(guò)期時(shí)間;如果尚未過(guò)期,則直接從緩存中讀取文件,不再訪問(wèn)服務(wù)器。
c. 如果緩存中文件的過(guò)期時(shí)間不存在或已超出,則瀏覽器會(huì)訪問(wèn)服務(wù)器獲取文件的頭信息,檢查last modifed和ETags等信息,如果發(fā)現(xiàn)本地緩存中的文件在上次訪問(wèn)后沒(méi)被修改,則使用本地緩存中的文件;如果修改過(guò),則從服務(wù)器上獲取最新版本。
我的經(jīng)驗(yàn),如果可能,盡量遵循此原則給靜態(tài)文件添加過(guò)期時(shí)間,這樣可以大幅度減少用戶對(duì)服務(wù)器資源的重復(fù)訪問(wèn)。
2)將css和js文件放在獨(dú)立外部文件中引用
將css和js文件放在獨(dú)立文件中,這樣它們會(huì)被單獨(dú)緩存起來(lái),在訪問(wèn)其他頁(yè)面時(shí)可以從瀏覽器的高速緩存中直接讀取。一些網(wǎng)站的首頁(yè)可能是例外的,這些首頁(yè)的自身瀏覽可能并不大,但卻是用戶訪問(wèn)網(wǎng)站的第一印象以及導(dǎo)向到其他頁(yè)面的起點(diǎn),也可能這些頁(yè)面本身使用了大量的ajax局部刷新及技術(shù),這時(shí)可以將 css和js文件直接寫在頁(yè)面中。
3)去掉重復(fù)的腳本
在IE中,包含重復(fù)的js腳本會(huì)導(dǎo)致瀏覽器的緩存不被使用,仔細(xì)檢查一下你的程序,去掉重復(fù)引用的腳本應(yīng)該不是一件很難的事情。
4)避免重定向的發(fā)生
除了在header中人為的重定向之外,網(wǎng)頁(yè)重定向常在不經(jīng)意間發(fā)生,被重定向的內(nèi)容將不會(huì)使用瀏覽器的緩存。比如用戶在訪問(wèn),服務(wù)器會(huì)通過(guò)301轉(zhuǎn)向到/,在后面加了一個(gè)“/”。如果服務(wù)器的配置不好,這也會(huì)給服務(wù)器帶來(lái)額外的負(fù)擔(dān)。通過(guò)配置apache的 alias或使用mod_rewrite模塊等方法,可以避免不必要的重定向。
還有一些,比如使用CDN分發(fā)機(jī)制、避免CSS表達(dá)式等、避免使用ETags等,因?yàn)椴惶S?,這里就不再贅述了。
做完了上述的優(yōu)化,可以試著用yslow測(cè)試一下網(wǎng)頁(yè)的性能評(píng)分,一般都可以達(dá)到70分以上了。
當(dāng)然,除了瀏覽器前端和靜態(tài)內(nèi)容的優(yōu)化之外,還有針對(duì)程序腳本、服務(wù)器、數(shù)據(jù)庫(kù)、負(fù)載的優(yōu)化,這些更深層次的優(yōu)化方法對(duì)技術(shù)有更高的要求。本文的后半部分將重點(diǎn)探討后端的優(yōu)化。
二、后端優(yōu)化
上次寫完web2.0網(wǎng)站前端優(yōu)化篇之后,一直想寫寫后端優(yōu)化的方法,今天終于有時(shí)間將思路整理了出來(lái)。
前端優(yōu)化可以避免我們?cè)斐蔁o(wú)謂的服務(wù)器和帶寬資源浪費(fèi),但隨著網(wǎng)站訪問(wèn)量的增加,僅靠前端優(yōu)化已經(jīng)不能解決所有問(wèn)題了,后端軟件處理并行請(qǐng)求的能力、程序運(yùn) 行的效率、硬件性能以及系統(tǒng)的可擴(kuò)展性,將成為影響網(wǎng)站性能和穩(wěn)定的關(guān)鍵瓶頸所在。優(yōu)化系統(tǒng)和程序的性能可以從以下的方面來(lái)入手:
1)apache、mysql等軟件的配置的優(yōu)化
盡管apache和mysql等軟件在安裝后使用的默認(rèn)設(shè)置足以使你的網(wǎng)站運(yùn)行起來(lái),但是通過(guò)調(diào)整mysql和apache的一些系統(tǒng)參數(shù),還是可以追求更高的效率和穩(wěn)定性。這個(gè)領(lǐng)域中有很多專業(yè)的文章和論壇(比如: ),要想掌握也需要進(jìn)行深入的研究和實(shí)踐,這里就不重點(diǎn)討論了。
2)應(yīng)用程序環(huán)境加速
這里僅以我最常應(yīng)用的php開(kāi)發(fā)環(huán)境為例,有一些工具軟件可以通過(guò)優(yōu)化PHP運(yùn)行環(huán)境來(lái)達(dá)到提速的目的,其基本原理大致是將PHP代碼預(yù)編譯并緩存起來(lái),而不需要改變?nèi)魏未a,所以比較簡(jiǎn)單,可以將php的運(yùn)行效率提升50%以上。比較常用的php加速工具有:APC( http: //pecl.php.net/package-info.php?package=APC)、Turck MMCache( )、php accelebrator(),還有收費(fèi)的Zend Performance Suite
3)將靜態(tài)內(nèi)容和動(dòng)態(tài)內(nèi)容分開(kāi)處理
apache是一個(gè)功能完善但比較龐大的web server,它的資源占用基本上和同時(shí)運(yùn)行的進(jìn)程數(shù)呈正比,對(duì)服務(wù)器內(nèi)存的消耗比較大,處理并行任務(wù)的效率也一般。在一些情況下,我們可以用比較輕量級(jí)的web server來(lái)host靜態(tài)的圖片、樣式表和javascript文件,這樣可以大大提升靜態(tài)文件的處理速度,還可以減少對(duì)內(nèi)存占用。我使用的web server是來(lái)自俄羅斯的nginx,其他選擇方案還包括lighttpd和thttpd等。
4)基于反向代理的前端訪問(wèn)負(fù)載均衡
當(dāng)一臺(tái)前端服務(wù)器不足以應(yīng)付用戶訪問(wèn)時(shí),通過(guò)前端機(jī)實(shí)現(xiàn)web訪問(wèn)的負(fù)載均衡是最快速可行的方案。通過(guò)apache的mod_proxy可以實(shí)現(xiàn)基于反向代理的負(fù)載均衡,這里推薦使用nginx做代理服務(wù)器,處理速度較apache更快一些。
5)應(yīng)用緩存技術(shù)提高數(shù)據(jù)庫(kù)效能,文件緩存和分布式緩存
數(shù)據(jù)庫(kù)訪問(wèn)處理并發(fā)訪問(wèn)的能力是很多網(wǎng)站應(yīng)用的關(guān)鍵瓶頸,在想到使用主從結(jié)構(gòu)和多farm的方式構(gòu)建服務(wù)器集群之前,首先應(yīng)該確保充分使用了數(shù)據(jù)庫(kù)查詢的緩存。一些數(shù)據(jù)庫(kù)類型(如mysql的innoDB)自身內(nèi)置對(duì)緩存的支持,此外,還可以利用程序方法將常用的查詢通過(guò)文件或內(nèi)存緩存起來(lái)。比如通過(guò) php中的ob_start和文件讀寫函數(shù)可以很方便的實(shí)現(xiàn)文件形式的緩存,而如果你擁有多臺(tái)服務(wù)器,可以通過(guò)memcache技術(shù)通過(guò)分布式共享內(nèi)存來(lái)對(duì)數(shù)據(jù)庫(kù)查詢進(jìn)行緩存,不僅效率高而且擴(kuò)展性好,memcache技術(shù)在livejournal和Craigslist.org等知名網(wǎng)站應(yīng)用中都得到了檢驗(yàn)。
6)服務(wù)器運(yùn)行狀態(tài)的檢測(cè),找到影響性能的瓶頸所在
系統(tǒng)優(yōu)化沒(méi)有一勞永逸的方法,需要通過(guò)檢測(cè)服務(wù)器的運(yùn)行狀態(tài)來(lái)及時(shí)發(fā)現(xiàn)影響性能的瓶頸,以及可能存在的潛在問(wèn)題,因?yàn)榫W(wǎng)站的性能,永遠(yuǎn)取決于木桶中的短板??梢跃帉懸恍┠_本來(lái)檢測(cè)web服務(wù)的運(yùn)行,也有一些開(kāi)源的軟件也提供了很好的功能
7)良好的擴(kuò)展架構(gòu)是穩(wěn)定和性能的基礎(chǔ)
一些技巧和竅門可以幫你度過(guò)眼前的難關(guān),但要想使網(wǎng)站具備應(yīng)付大規(guī)模訪問(wèn)的能力,則需要從系統(tǒng)架構(gòu)上進(jìn)行徹底的規(guī)劃,好在很多前人無(wú)私的把他們架構(gòu)
網(wǎng)站的經(jīng)驗(yàn)分享給我們,使我們可以少走甚多彎路。我最近讀到的兩篇有啟發(fā)的文章:
- 從LiveJournal后臺(tái)發(fā)展看大規(guī)模網(wǎng)站性能優(yōu)化方法
- Myspace的六次重構(gòu)
最后不得不提到程序編碼和數(shù)據(jù)庫(kù)結(jié)構(gòu)對(duì)性能的影響,一系列糟糕的循環(huán)語(yǔ)句,一個(gè)不合理的查詢語(yǔ)句、一張?jiān)O(shè)計(jì)不佳的數(shù)據(jù)表或索引表,都足以會(huì)使應(yīng)用程序運(yùn)行的速度成倍的降低。培養(yǎng)全局思考的能力,養(yǎng)成良好的編程習(xí)慣,并對(duì)數(shù)據(jù)庫(kù)運(yùn)行機(jī)制有所了解,是提高編程質(zhì)量的基礎(chǔ)。
以上就是關(guān)于前端頁(yè)面性能優(yōu)化相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
前端頁(yè)面性能優(yōu)化(前端頁(yè)面性能優(yōu)化指標(biāo)有哪些)
杭州的前端開(kāi)發(fā)好找嗎(杭州的前端開(kāi)發(fā)好找嗎工資高嗎)
景觀設(shè)計(jì)如何選擇燈具類型(景觀設(shè)計(jì)如何選擇燈具類型圖片)