代碼最佳化

代碼最佳化

所謂代碼最佳化是指對程式代碼進行等價(指不改變程式的運行結果)變換。程式代碼可以是中間代碼(如四元式代碼),也可以是目標代碼。等價的含義是使得變換後的代碼運行結果與變換前代碼運行結果相同。最佳化的含義是最終生成的目標代碼短(運行時間更短、占用空間更小),時空效率最佳化。原則上,最佳化可以在編譯的各個階段進行,但最主要的一類是對中間代碼進行最佳化,這類最佳化不依賴於具體的計算機

在不改變程式運行效果的前提下,對被編譯的程式進行等價變換,使之能生成更加高效的目標代碼。

基本介紹

  • 中文名:代碼最佳化
  • 領域:編譯原理
  • 本質:對程式等價變換
概述,代碼最佳化過程,途徑,最佳化目的,為什麼要實施最佳化,最佳化所涉及的源程式的範圍,具最佳化功能編譯器的組織,分類,局部最佳化,基本塊,基本塊特點,基本塊劃分,要點,html最佳化,title標籤,META元素,h標籤,加強和強調,alt和title,縮寫abbr,canonical標籤,css最佳化,外鏈css,精簡css,整合css,壓縮css,script最佳化,外鏈js代碼,精簡js代碼,壓縮js代碼,置底js,最佳化禁忌,

概述

在不改變程式運行效果的前提下,對被編譯的程式進行等價變換,使之能生成更加高效目標代碼。

代碼最佳化過程

等價:不改變程式執行效果;
變換:引起程式形式上的變動.

途徑

改進、提高程式途徑:
1) 改進算法;
2) 在源程式級上等價變換;
3) 充分利用系統提供的程式庫;
4) 編譯時最佳化等。

最佳化目的

產生高效的目標代碼。

為什麼要實施最佳化

最佳化程度是編譯器的一個重要技術、質量目標;
無法苛求用戶對源語言的掌握,編程技巧.編寫源程式的最佳化;
編譯程式固有的缺陷:不是面對一個或一類具體問題的程式,而是統一處理該語言的各種源程式,無法盡善盡美。

最佳化所涉及的源程式的範圍

局部最佳化 — 基本塊內最佳化;
循環最佳化 — 隱式、顯式循環體內最佳化;
全局最佳化 — 一個源程式範圍內最佳化;
最佳化相對於編譯邏輯功能實現的階段,中間代碼級 — 目標代碼生成前的最佳化;目標代碼級 — 目標代碼生成後的最佳化。

具最佳化功能編譯器的組織

代碼最佳化

分類

編譯過程中可進行的最佳化可按階段劃分:最佳化可在編譯的不同階段進行,分為中間代碼一級和目標代碼一級的最佳化。可按最佳化涉及的程式範圍劃分:對同一階段,分為局部最佳化,循環最佳化和全局最佳化. 進行最佳化所需要的基礎是對代碼進行數據流分析和控制流分析。如劃分DAG,查找循環,分析變數的定值點和引用點等等。最常用的代碼最佳化技術有刪除多餘運算,循環不變代碼外提,強度削弱,變換循環控制條件,合併已知量與複寫傳播,以及刪除無用賦值等等。
靜態網頁動態網頁主要根據網頁製作的語言來區分:
·靜態網頁使用語言:HTML(超文本標記語言)
·動態網頁使用語言:HTML+ASP或HTML+PHP或HTML+JSP等。
網站源碼可以分為動態源碼和靜態源碼:
·動態源碼:ASP、PHP、JSP、.net、CGI等等,動態源碼最大的特點就是能夠和用戶之間互動。
·靜態源碼:htmlFlashJavaScriptVBScript等等。

局部最佳化

在編譯原理中,局部最佳化指在程式的一個基本塊內進行的最佳化。

基本塊

一順序執行的最大語句序列,只有惟一入口和惟一出口,且分別對應該序列的第一個語句和最後一個語句 。

基本塊特點

基本塊內的語句是順序執行的,沒有轉進轉出,分叉匯合 。

基本塊劃分

第1步:確定每個基本塊的入口語句。
根據基本塊的結構特點,它的入口語句是下述三種類型的語句之一:⑴ 程式的第一個語句;⑵ 由條件轉移語句或無條件轉移語句轉移 到的語句;⑶ 緊跟在條件轉移或無條件轉移後面的語句。
第2步:根據確定的基本塊的入口語句,構造其所屬的基本塊。
⑴ 由該入口語句直到下一個入口語句(不包含下一個入口語句)之間的所有語句構成一個基本塊;⑵ 由該入口語句到程式中的停止或暫停語句或最後一個語句(包含該停止或暫停或最後語句)之間的語句序列組成的。
第3步:凡是未包含在基本塊中的語句,都是程式的控制流不可到達的語句,直接從程式中刪除。

要點

一. 儘量採用div+css布局您的頁面,div+css布局的好處是讓搜尋引擎爬蟲能夠更順利的、更快的、更友好的爬完您的頁面;div+css布局還可以大量縮減網頁大小,提高瀏覽的速度,使得代碼更簡潔、流暢、更容易放置更多內容。
二. 儘量縮減您的頁面大小,因為搜尋引擎爬蟲每次爬行您的站點時,存儲數據的容量有限,一般建議100KB以下,越小越好,但不能小於5KB。網頁大小減少還有一個好處,能夠促使您的站點形成巨大的內部連結網。
三. 儘量少用無用的圖片和flash。內容索引所派出的搜尋引擎爬蟲,不認識圖片,只能根據圖片ALT,TITLE”等屬性的內容判斷圖片的內容。對於flash搜尋引擎爬蟲更是視而不見。
四. 儘量滿足w3c標準,網頁代碼的編寫滿足W3C標準,能夠提升網站和搜尋引擎的友好度,因為搜尋引擎收錄標準,排名算法,都是在W3C標準的基礎上開發的。
五. 儘量更深層次套用標籤h1、h2、h3、h4、h5…..,讓搜尋引擎能夠分辨清晰網頁那一塊很重要,那一塊次之。
六. 儘量少用JS,JS代碼全部用外部調用檔案封裝。搜尋引擎不喜歡JS,影響網站的友好度指數。
七. 儘量不使用表格布局,因為搜尋引擎對表格布局嵌套3層以內的內容懶的去抓取。搜尋引擎爬蟲有時候也是比較懶的,望各位一定要保持代碼和內容在3層以內。
八. 儘量不讓CSS分散在HTML標記里,儘量封裝到外部調用檔案。如果CSS出現在HTML標記里,搜尋引擎爬蟲就要分散注意力去關注這些對最佳化沒有任何意義的東西,所以建議封裝到專用CSS檔案中。
九.清理垃圾代碼,要把代碼編輯環境下敲擊鍵盤上的空格鍵所產生的符號;把一些默認屬性代碼,不會影響顯示的代碼;注釋語句如果對代碼可讀性沒有太大影響,清理這些垃圾代碼,會減少不少的空間。

html最佳化

html代碼是最為基礎的網站製作語言,對於網站最佳化來說,html代碼也有一定的影響,是特別需要注意的最佳化細節之一。

title標籤

title標籤就是網頁的標題,是一個對於網站最佳化有很大影響的html標籤,每個頁面都必須有且內容不同!基本格式為<title>網頁標題。</title>

META元素

meta元素在瀏覽器界面是無法看到的html標籤,對於最佳化有影響的主要有兩個,一個是關鍵字(keywords)、一個是描述(description)。其實,這兩個標籤隨著seoer的胡亂使用,對於網站最佳化已經沒有多少用處了,你完全可以不用設定,但我們還是習慣性的設定一下較為妥當。關鍵字,設定與本頁內容相關的主關鍵字一到三個,之間用英文狀態下的逗號分割。需要注意的是,不要再濫用關鍵字,除了給搜尋引擎不好的印象外別無他用。描述還是很有用的一個東東了,雖然對於網站的最佳化排名么有多大的影響,但會作為搜尋引擎展示網站索引的一個依據,可以把你的主關鍵字連結起來組合成一段通順的話,一般60到80字即可。格式為:
<meta name="keywords"content="">
<metaname="description"content="">

h標籤

h標籤在html代碼中是“標題”的意思,就如一篇文章,標題是文章最為重要的一個對象,也是搜尋引擎在排名時重點考慮的一個對象。html中的h標籤一共有六個,分別是h1/h2/h3/h4/h5/h6,分別代表不同的級別,我們稱之為一級標題、二級標題……當然,一級標題具備更多的權重。需要注意的是h標籤是塊級元素,默認是粗體顯示,獨占一行,前後會有空行。當然,你可以利用css來改變這些效果。
關於h標籤的使用,需要根據實際情況來使用,不可任意濫用。如一篇文章,不可能出現多個一級標題,所以h1,在同一個頁面中只能出現一次,而h2等則可以出現多次,根據你需要表現的內容的重要程度,分別使用不同的h標籤即可。特別注意,h標籤中最好出現關鍵字!還有就是,隨其自然,萬不可刻意地用h標籤來處理某些關鍵字!
基本格式為:<h1>這裡是標題文字</h1>

加強和強調

strong被認為是“加強”,em被認為是“強調”,也就是這兩個標籤是有特殊含義的,這對於網站最佳化至關重要。多數時候,我們在最佳化網站時會對關鍵字進行突出,這時使用strong或em就比使用B或者I好很多,特別謹記!

alt和title

alt是圖像中的注釋,title是圖像或連結的標題,這兩者對於最佳化,尤其是圖像的最佳化至關重要,但也不要濫用!一般在插入圖像時,我們在alt中設定圖像的描述內容,其中可以包含關鍵字但不要故意堆砌,title則當作圖像標題來處理。特別需要注意的是,這些內容是不可以重複的!也就是說,當你的頁面中有多張圖像,你不能每張圖像的描述和標題都設定成一樣的,這樣很容易被搜尋引擎懲罰!
<img src="test.jpg"alt="一個美女站在黃昏的街頭默默等待愛人的回歸,眼神中充滿了憂傷"title="靜待">
除此之外,title屬性在a標籤中也有所使用,只是有些泛濫了,視覺效果也不好,影響用戶體驗,所以筆者並不推薦,除非你的a標籤中的內容是一張圖片。
<a href="product.html"title="產品展示">產品展示</a>

縮寫abbr

這個標籤是自定義的一種縮寫方式,可以利用它合理的添加一些關鍵字,同樣不要濫用。如下所示:
公司的產品涉及<abbr title="以石材為原料的雕刻作品">石雕</abbr>、<abbr title="以銅料為胚,運用雕刻、鑄塑等手法製作的一種造型藝術">銅雕</abbr>、<abbr title="附屬在某一平面上的雕刻藝術">浮雕</abbr>、鏤雕等各種雕刻形式。

canonical標籤

Canonical(權威連結標記)是09年,Google,Yahoo及Microsoft三大搜尋引擎聯合推出了一個旨在減少重複內容的一個建議,並不是命令,也就是說這個標籤搜尋引擎可能不遵守。國內最大的中文搜尋引擎百度也已經支持Canonical標籤。
部分搜尋引擎引入了Link的一個新屬性Canonical。A頁面聲明B為權威連結,B聲明C為權威網頁,則搜尋引擎會認為C是A和B共同的首選權威版本。此時Canonical標籤起到了301重定向的作用。
只能作用於同一個域名所在的網址,不能作用於不同域名上的重複內容。也就是說如果文章被其它網站抄襲,也不會因為這個標籤而給你的原文章帶來權重。如果是跨站,可以使用301重定向。該連結標籤可用於定義相對地址,也可用於定義絕對地址。但為了保險起見,建議使用絕對地址
使用方法:為網頁指定權威連結(authoritative|canonical URL),以解決副本內容(duplicate content)問題。
使用樣式:<link rel=”canonical” href=”網頁權威連結”/>

css最佳化

於網站排名最佳化來說,css的幾乎沒有任何影響,但往大的方向如網站最佳化來說,樣式表css的最佳化就至關重要了,其主要作用即是提高網頁的回響速度。

外鏈css

css的使用有多種方式,一是嵌入式,即在html標籤中直接定義樣式表,如下所示:<p style="font-family:arial;font-size:16px;font-weight:bold;">Outside now its raining,and tears are falling from my eyes…</p>
還有一種是直接定義在頁面頭部的如下:<styletype="text/css">p{ background:#f1f1f1; color:#333; line-height:20px;} </style>
這兩種方式都是把css寫在當前html中,這樣會造成hml文檔變大,降低網頁的回響速度,所以我們需要外鏈css,將所有與本頁面相關的樣式寫入到該樣式表中:<link href="style/common.css"rel="stylesheet"type="text/css"/>

精簡css

對於這一點需要一定的css能力才可以做到了。所謂精簡,指的是用儘可能少的樣式代碼實現整個網頁的樣式效果,需要充分利用css的繼承和綜合使用,舉一個簡單的例子來說明。如頁面中的連結,全部不需要下劃線、大部分為12像素,但連結的顏色並不相同,個別的字型效果也不相同,我們就可以這樣來寫:
a{ text-decoration:none; font-size:12px;}/*定義通用a樣式*/
a.a_red{ color:#e00;}
a.a_blue{ color:#009;}
a.a_menu{ color:#fff; font-size:14px; font-weight:bold;}/*針對特殊a標籤只指定特殊樣式*/
因為css的繼承作用,a_red和a_blue都具備沒有下劃線、12像素這一樣式,而a_menu同樣具備沒有下劃線,但因指定了大小,就不再繼承12像素的指定而使用14像素……

整合css

一般情況下,前端製作人員喜歡把通用樣式寫成一個檔案,把專用樣式寫成另一個檔案以便各個頁面調用。如筆者,就喜歡把頁面通用樣式(包括通用的布局樣式、文字樣式等)寫在common.css中,而把專用的寫在另一個樣式表中。如首頁,我們就需要調用common.css和index.css兩個樣式表檔案。這樣做,對於前端來說是正確的。但對於最佳化,卻不太好。多一個檔案調用就需要多一次請求,當然也會多耗費一點時間。所以,在網站製作完成後,我們需要把頁面的所有樣式合併大一起以提高網頁的回響速度!但需注意,合併css不利於網站後期整改,權衡利弊各取所需吧,具體是否合併還需根據你的實際情況而定。

壓縮css

壓縮css其實很簡單,就是去掉多餘的空格和換行。實現起來也非常的簡單,網上有很多工具,請自行搜尋“css壓縮”即可找到很多線上壓縮工具。同上面一點,壓縮後的css不便於後期整改,需要自己權衡取捨。

script最佳化

javascript代碼對於網站排名最佳化同樣沒有多大影響,但從網站最佳化的角度來看卻是至關重要的一步最佳化操作,優良的javascript代碼可以大幅度提升網頁的回響速度!

外鏈js代碼

js代碼跟css的使用差不多,都有三種方式:
內部定義:<A onclick="if(confirm('確認?'){...}else{...})"href="#">confirm</A>
頭部插入:<script>...</script>
外鏈調用:<SCRIPT language=javascript type=text/javascript src="jquery-1.7.2.min.js"></SCRIPT>

精簡js代碼

這一點需要更為專業的js技術才能做到,儘可能根據需要實現的效果編寫js,而不用從網上找一段代碼直接拿來用,網上的代碼很多功能很全,從而質量很大,而其中的很多功能對於我們要實現的效果是沒有任何用處的,所以廣拓企業網站建議你針對需要實現的效果定製js以便得到更為精簡的代碼,從而提高網頁的回響速度。

壓縮js代碼

對於這點,網上也有很多的工具,請百度查詢“js壓縮工具”即可。

置底js

一般情況下,我們都是把js放到head之間的,這種方式在頁面載入時即會載入,當然也就導致回響速度的降低,百度站長平台建議把js放到頁面最底部,也就是</html>之外。等html載入完畢之後才載入js代碼,當然,有部分特殊功能的js代碼是沒有辦法放到頁面底部的,具體請根據實際情況操作。
補充說明:針對js圖像特效等,可能會影響網站關鍵字排名的!有的特效圖像的路徑、說明等都是寫入到js中的,這種特效儘量不要使用。

最佳化禁忌

·究竟要最佳化什麼?
在最佳化工作開始的時候,你還尚未明確最佳化內容和目的,那么你很容易陷入誤區。在一開始,你就應該清楚地了解你要達到的效果,以及其他最佳化相關的各種問題。這些目標需要明確指出(至少精通技術的項目經理可以理解和表達它),接下來,在整個最佳化過程中,你需要堅持這些目標。
在實際的項目開發中,經常會存在各種各樣的變數。可能一開始時要最佳化這一方面,隨後你可能會發現需要最佳化另一方面。這種情況下,你需要清晰地了解這些變化,並確保團隊中的每個人都明白目標已經發生了變化。
·選擇一個正確的最佳化指標
選擇正確的指標,是最佳化的一個重要組成部分,你需要按照這些指標來測量最佳化工作的進展情況。如果指標選擇不恰當,或者完全錯誤,你所做的努力有可能白費了。
即使指標正確,也必須有一些辨別。在某些情況下,將最多的努力投入到運行消耗時間最多的那部分代碼中,這是實用的策略。但也要記住,Unix/Linux核心的大部分時間花費在了空循環上。
需要注意的是,如果你輕易選擇了一個很容易達到的指標,這作用不大,因為沒有真正解決問題。你有必要選擇一個更複雜的、更接近你的目標的指標。
·最佳化在刀刃上
這是有效最佳化的關鍵。找到項目中與你的目標(性能、資源或其他)相背的地方,並將你的努力和時間用在那裡。
舉一個典型的例子,一個Web項目速度比較慢,開發者在最佳化時將大部分精力放在了資料庫最佳化上,最終發現真正的問題是網路連線慢。
另外,不要分心於容易實現的問題。這些問題儘管很容易解決,但可能不是必要的,或與你的目標不相符。容易最佳化並不意味著值得你花費工夫。
·最佳化層次越高越好
在一般情況下,最佳化的層次越高,就會越有效。根據這個標準,最好的最佳化是找到一個更有效的算法。舉個例子,在一個軟體開發項目中,有一個重要的應用程式性能較差,於是開發團隊開始著手最佳化,但性能並沒有提升太多,之後,項目人員交替,新的開發人員在檢查代碼時發現,性能問題的核心是由於在表中使用了冒泡排序算法,導致成千上萬項的增加。
儘管如此,高層次的最佳化也不是“銀彈”。一些基本技術,如將所有東西移到循環語句外,也可以產生一些最佳化的效果。通常情況下,大量低層次的最佳化可以產生等同於一個高層次最佳化的效果。
還需要注意的是,高層次最佳化,會減少一些代碼塊,那么你之前對這些代碼塊所做的最佳化就沒有任何意義了,因此,剛開始就應該考慮高層次的最佳化。
·不要過早最佳化
在項目早期就進行最佳化,會導致你的代碼難以閱讀,或者會影響運行。另一方面,在項目後期,你可能會發現之前所做的最佳化沒有起到任何作用,白白浪費了時間和精力。正確的方式是,你應該將項目開發和最佳化當作兩個獨立的步驟來做。
·依賴性能分析,而不是直覺
你往往會認為你已經知道哪裡需要最佳化,這是不可取的,尤其是在複雜的軟體系統中,性能分析數據應該是第一位的,最後才是直覺。
最佳化的一個有效的策略是,你要根據所做工作對最佳化效果的影響來進行排序。在開始工作之前找到影響最大的“路障”,然後再處理小的“路障”。
·最佳化不是萬金油
最佳化最重要的規則之一是,你無法最佳化一切,甚至無法同時最佳化兩個問題。比如,最佳化了速度,可能會增加資源利用;最佳化了存儲的利用率,可能會使其他地方放慢。你需要權衡一下,哪個更符合你的最佳化目標。

相關詞條

熱門詞條

聯絡我們