當前位置:首頁 » 編程軟體 » 編譯原理局部代碼優化的主要方法

編譯原理局部代碼優化的主要方法

發布時間: 2022-07-15 05:21:06

1. 求助怎樣讓編譯器只優化部分代碼

編譯器,是將便於人編寫,閱讀,維護的高級計算機語言翻譯為計算機能解讀、運行的低階機器語言的程序。編譯器將原始程序(Source program)作為輸入,翻譯產生使用目標語言(Target language)的等價程序。源代碼一般為高階語言 (High-level language), 如 Pascal、C++、Java 等,而目標語言則是匯編語言或目標機器的目標代碼(Object code),有時也稱作機器代碼(Machine code)。
一個現代編譯器的主要工作流程如下:
源代碼 (source code) → 預處理器 (preprocessor) → 編譯器 (compiler) → 匯編程序 (assembler) → 目標代碼 (object code) → 連接器 (Linker) → 可執行程序 (executables)!

2. 如何對編程代碼進行優化

優化是專業性很高的工作,需要了解編譯器的運行原理, 建議可以細讀編譯原理這門課程。 另外一般普通的優化編譯器本身做的就已經很好了。

3. 代碼優化從那裡入手

優化見解
php作為腳本語言被廣泛應用於網頁網站程序設計中。

由於是腳本語言,在運行時才對高級語言代碼解釋執行,所以跟編譯語言(如C)比起來php的效率比較低,稍復雜的程序執行起來就需要消耗較多的時間。作為網頁伺服器時,低效率意味著消耗更多的伺服器資源。所以,有必要通過優化php 程序代碼來提高效率,減小伺服器資源消耗。(當然如果你的程序本來就消耗很少執行時間或者你的伺服器足夠強,那就不一定要進行優化了)

網上很多文章介紹優化php程序,是通過安裝Zend Optimizer之類的加速軟體實現的,但這種加速是有限的。本文主要從程序代碼著手介紹一些優化思路和手段。

程序的抽象層越多,各抽象層分離得越嚴格,程序效率越低。

最原始的應用於網頁的php程序模式莫過於腳本嵌入模式,即僅僅在一個網頁中需要動態處理或顯示數據的地方通過加入<?php和?>標識符嵌入php腳本。一般來說這是php程序員最早學習的模式,它只有一個抽象層,就是網頁,故本文稱其為單層模式。

隨著網站規模逐漸增大,程序員可能會發現單層模式的程序很難維護,當想對程序修改或擴充功能時,會發現代碼非常混亂,感覺無從下手。於是模板類誕生了,它使得一個網頁由兩個文件組成:一個php程序文件,一個html模板文件。常用的模板類有PHPLib庫帶的Template模板類,Smarty模板類等。由於加入了額外的處理程序(模板類),程序效率下降了。你若不信可自己測試一下。其實一般情況下,不用函數(最原始的編程方法)比用函數(面向過程)的效率高,而用函數的效率又比對象封裝(面向對象)高。所以就算在編譯語言中,需要高效率的地方會用C寫而不用C++,例如FreeBSD操作系統的內核;而需要極端高效的地方還要用匯編寫。

為了使程序可以適應多種資料庫系統,或者方便隨時轉換資料庫系統,常常還會用一個類把跟資料庫打交道的函數封裝起來,這樣當轉換資料庫系統時只要把封裝類換掉就行了,主程序不需要修改。這里又用了一個類,效率又打折扣了。

上述模板類的使用,使程序分成兩個抽象層:程序層和表現層。而資料庫類的使用又把程序層分為數據介面層和數據處理層。

項目越龐大,需要分離的抽象層就越多,這樣使得分工清晰,方便管理,但是以犧牲程序執行效率為代價。

對於抽象層造成的效率下降,優化的方法有二:減小抽象層、優化抽象層之間的介面。一般地,不應該為了提高效率而盲目減小抽象層,這樣會使得代碼混亂、難於管理。但是不應該為小項目建立過多的抽象層,除非你有將來把它做得很大的計劃。關於如何恰當分割抽象層,本文不作更深入討論。

對於上文說的兩個分層例子,優化抽象層之間的介面分別是模板類和資料庫操作類。抽象層介面在程序中需要被頻繁調用,以在不同層之間交換信息,所以層介面是很值得優化的。對於資料庫介面類,可能僅僅是封裝一些資料庫函數,優化餘地恐怕不大。對於模板類,很多時候是有較大優化餘地的。一般地,模板模型越通用,模板類功能越強大,效率就越低,例如PHPLib庫帶的Template類就有極大的優化餘地。而Smarty模板類比PHPLib的Template更復雜,我沒有用過,據稱有緩存機制,不知是否可以彌補其性能損耗。下面就來看看PHPLib的Template類有多少東西可以優化掉。

1.

讀入模板文件時,file函數效率低,改用get_file_content函數。
2.

匹配子模板時,正則表達式替換函數preg_replace效率低,改用str_pos函數進行定位和用str_replace函數進行替換操作。此優化手段後文會詳細分析。
3.

模板模型通用性很強,能適應各種情況,但在具體細節的處理上,通用的方法效率可能很低。可以對模板模型作適當修改。我的做法是建一個相對通用的模板類,然後再派生出一個只適用於特定程序的模板類。在通用模板類的模板模型上可以作些優化(相對於PHPLib的Template),例如在處理二維數據表的時候用 PHPLib的Template處理就比較復雜(具體實現方法可參考《優化php嵌套模版》),需要多次調用類方法(本質上是函數調用),所以重寫的時候可以把處理二維數據表的功能封裝到一個高效率的方法中,直接避免方法的多次調用。
4.

調試功能在小項目上不需要用,跟調試相關的代碼全部去掉。

我在按上面4點重寫了模板類之後,一個復雜頁面的執行時間縮小了一個數量級(除模板外沒有作其它優化)。

現在就優化你的程序的抽象層之間的介面,特別是當這些介面是使用現成的函數或類的時候。因為這些函數或類在設計時會為了適應普遍情況而犧牲一些效率,而且它們的作者也可能沒有考慮效率問題。像如此著名的PHPLib的模板類的效率也不見得就高。
細節代碼優化

優化代碼不應總是祈求大刀闊斧式的優化,當大方面已經無從入手時,不妨把視線轉移到細節上。

1.

上文模板類優化已提到的,正則表達式匹配比一般字元串匹配慢得多,盡可能用字元串匹配而不用正則表達式匹配。有時候雖然用正則表達式匹配使程序代碼更簡潔,而一般字元串匹配使代碼更冗繁,但很多時候字元串匹配仍比正則表達式高效。
2.

字元串替換函數str_replace和preg_replace都是可以接受數組參數的。有時候需要對字元串進行批量替換,則用數組參數比循環調用替換函數來得高效。例如下面的代碼:
1. for ($i = 0; $i < $n; $i++) {
2. $str = str_replace($search[$i], $replace[$i], $str);
3. }

應該換成:
1. $str = str_replace($search, $replace, $str);

注意:這里$search和$replace都是數組

str_replace和preg_replace的數組用法可參考PHP手冊。
3.

對用於賦值的條件語句,可改用?:算符

這里僅舉三個細節代碼優化的方法。實際上PHP程序還有很多細節代碼優化方法,要掌握這些方法,需要多看PHP手冊,多了解些函數。在解決一些細節問題時,用不同的函數作不同的搭配,就產生不同的方法,對不同的方法應進行實際效率測試,得出優化方法。
面向對象、面向過程、類、函數、宏

盡管面向對象方法在程序設計中有很多優點(這里就不羅列了),但一般地說,面向對象程序的執行效率往往不如面向過程好,一個顯然的理由是面向對象的程序往往要頻繁調用對象的方法從而使代碼簡潔明了,卻降低了程序執行效率。

對於中小型項目,為程序效率著想,最好在思想上,面向對象與面向過程兼有,在代碼上,類、函數、宏搭配使用。這里提到一個可能對讀者陌生的概念——宏(macro)。在C語言中有宏,宏匯編中也有宏,但PHP中官方沒有定義「宏」的概念。然而我們可以通過require函數和include函數實現宏的功能。require和include通常用來在程序代碼中包含函數庫或類庫等文件,一般很少用來直接包含程序代碼文件,因為包含程序代碼有時會降低代碼易讀性。當有一段代碼需要在很多頁面中都執行時,通常被想到的是把它打包為函數或封裝為類。但此法有缺點如下:

1.

降低程序效率。因為增加了函數/類方法調用。
2.

有時此段嵌入代碼較復雜,實現功能並不單純,封進函數並不符合函數功能單純的原則。
3.

有時嵌入代碼需要與外部大量交換數據,如果封進函數會使參數表龐大,且處理函數的返回值也變得復雜。
4.

由於有2、3兩點缺點,導致當嵌入代碼與外部代碼交換的數據有所變化時,函數或類的介面的更改會變得麻煩。

當遇上以上情況時,我建議使用宏,即把嵌入代碼直接寫入被包含文件中,供各頁麵包含。但此時務必要清晰注釋宏的調用方法,輸入輸出數據等,以彌補代碼易讀性的降低。

總之,面向對象、面向過程、類、函數、宏,這些都應根據具體實際情況而搭配使用,不應盲目死守某些原則。
SQL資料庫

本來SQL資料庫的優化不應歸入PHP優化,但實際應用中PHP常與SQL資料庫配合構建網站,常用的資料庫有MySQL、PostgreSQL等。於是SQL查詢的效率也直接影響PHP程序的效率,故本文也略為談一談。

1.

MySQL 中,使用InnoDB或BDB表(支持事務)的效率比MyISAM表(不支持事務)的效率低,尤其InnoDB表效率比MyISAM低很多,而BDB表的主要劣勢在於佔用磁碟空間比MyISAM表多很多,且不能查知每個表佔用磁碟空間的大小。而對中小型應用,數據不一致性出現的概率是很微的,所以盡可使用 MyISAM表提高效率。(關於MySQL數據表的更多討論可參考《MySQL 中三種數據表的對比》)
2.

恰當建立索引和存儲冗餘數據。此話題太大故本文不打算作詳述。
3.

有些SQL查詢僅需知道資料庫中是否存在符合條件的行,故只要查得一行,搜索即可結束。所以對此類查詢,可在SQL句末加上LIMIT 1使資料庫一旦搜到滿足條件的行即不再搜索。
4.

盡量少用JOIN,有些低效率的JOIN查詢可通過存儲冗餘數據來避免。
5.

有時候需要比較現在的時間與資料庫某列的時間的差距,返回時間差距滿足一定條件的行。在MySQL 4.1之前,是沒有DATEDIFF函數的,但可以用DATE_ADD或DATE_SUB函數簡潔實現,例如要返回xtime列距今超過10天的行,有兩種寫法:

法一:
1. SELECT somecolumn FROM sometable WHERE DATE_ADD(xtime, INTERVAL 10 DAY) < NOW()

法二:
1. SELECT somecolumn FROM sometable WHERE DATE_SUB(NOW(), INTERVAL 10 DAY) > xtime

兩種寫法執行結果等效但效率不同。如果xtime列建有索引,則法一的寫法無法使用索引,而法二的寫法可以用索引,故應採用第二種寫法提高效率。

除此之外,SQL資料庫優化還大有學問。
延遲輸出與緩沖

有時候有些頁面無論如何也無法優化到需要的速度,此時可以考慮使用延遲輸出與緩沖的技術。

關於延遲輸出,可參考《動態網頁中慢數據的延遲輸出》,本文不再詳述。

而緩沖也是一個大話題,故本文也不打算作詳述,但作一簡介。

常用的技術,按網站軟體層次分,有網頁服務軟體的緩沖技術,例如Apache的緩沖技術;又有動態腳本的緩沖技術,例如用PHP編程實現的緩沖技術。

此外又可分為靜態緩沖技術和動態緩沖技術。靜態緩沖技術即把動態內容生成靜態的html頁面存於磁碟,客戶端幾乎完全跟靜態頁面打交道,整個網站猶如一個靜態網站。而伺服器後台在適當時候調用動態程序更新靜態內容(重新生成靜態內容)。動態緩沖技術則是客戶端仍與動態頁面打交道,而動態網頁在接到客戶請求時先檢查是否有相應的緩沖網頁,如有,直接把該靜態頁輸出到客戶端,如無或緩沖頁已過時,則重新生成緩沖頁面並輸出到客戶端。

雖然本文篇幅已經有相當長度,但對PHP優化這個大話題來說只是一個概述,很多優化技術也只是點到為止。讀者可擇感興趣的技術看更多的資料作深入學習。

4. 編譯原理 代碼優化的方法有哪些

  1. 最直接有效的就是使用css+div的格式,將網頁中的樣式都放到css中,代碼直接調取相應的css文件

  2. 寫代碼的時候不需要的空格不要留,減小代碼所佔的空間

5. 怎麼樣優化代碼

優化代碼一般是編譯器的問題,當然你也可以在寫程序的時候直接盡可能的優化你的代碼,以減少目標程序代碼或減少程序內存使用,一般的優化方法有:代碼外提,強度削弱和刪除歸納變數幾種方法,具體你可以參考編譯原理了解

6. 編譯原理中代碼優化依據什麼原則

  1. 等價原則。經過優化後不應該改變程序運行的結果。

  2. 等效原則。使優化後所產生的目標代碼運行時間較短,佔用的儲存空間較小。

  3. 合算原則。應盡可能以較低的代價取得較好的優化效果。

    程序設計語言編譯原理(第三版)P272

7. 求C語言程序代碼:編譯原理的中間代碼的局部優化 ,要求:1構建基本塊,2常值表達式、公共、無用賦值優化.

有郵箱嗎

8. 編譯原理這門課程第八章代碼優化的知識點有哪些

編譯原理這門課第八章代碼優化的知識點包含章節導引,第一節優化的主要種類,第二節流圖中的循環,第三節全局數據流分析介紹,第四節代碼改進變換,課後練習,。

9. 編譯原理優化遵循哪些原則

真好奇的話,可以去翻翻《編譯原理》。不然,咱們只需要知道:1、優化有執行速度優化和空間優化兩種;2、優化級別越高,對代碼編寫質量的要求越高。如恰當地應用遞歸,使用volatile關鍵字等等,所以現實工程中一般不會開到最高優化級;3、想不出來了。。

熱點內容
安卓怎麼關閉藍牙自動連接 發布:2024-09-08 10:58:12 瀏覽:11
tsm伺服器修改ip地址 發布:2024-09-08 10:21:06 瀏覽:615
共享雲源碼 發布:2024-09-08 10:01:10 瀏覽:397
ios應用上傳 發布:2024-09-08 09:39:41 瀏覽:441
ios儲存密碼哪裡看 發布:2024-09-08 09:30:02 瀏覽:874
opensslcmake編譯 發布:2024-09-08 09:08:48 瀏覽:653
linux下ntp伺服器搭建 發布:2024-09-08 08:26:46 瀏覽:744
db2新建資料庫 發布:2024-09-08 08:10:19 瀏覽:173
頻率計源碼 發布:2024-09-08 07:40:26 瀏覽:780
奧迪a6哪個配置帶後排加熱 發布:2024-09-08 07:06:32 瀏覽:101