當前位置:首頁 » 編程軟體 » 虛函數final提高編譯效率

虛函數final提高編譯效率

發布時間: 2022-02-17 08:33:35

① 預編譯頭文件會提高程序性能嗎

預編譯不涉及到代碼本身的優化級別,更不會修改代碼,所以同樣的內容不可能產生程序性能的優化的

java方法中變數用final修飾對性能有影響!你覺得呢

在java中使用final修飾類型(包括類和介面)或類的成員與修飾方法中的普通變數從JVM的角度上看是不一樣的!鑒於你談論的是用其修飾方法中普通變數的形式,故簡單說一下這方面的東東。

是否使用final修飾方法中普通變數對JVM來說沒有區別!使用final修飾方法中普通變數主要是為了給Java前端編譯器(如javac)看的!也就是說方法中被final修飾的普通變數在前端編譯時被javac檢查並保證該變數不會在作用域內被改變新值,但被編譯成位元組碼後用於修飾方法中普通變數的final就已經不存在了!說的再具體點就是你用或不用final修飾方法中普通變數而生成的位元組碼文件(.class文件)沒有區別(建議你用某種Class文件編輯器查看一下)!!! 當然在編譯過程中會掃描final關鍵字並對其生成詞法單元(Token),同時生成的抽象語法樹(AST)在未優化之前也是有區別的。
故如你所說的「普通方法中變數用final修飾的,方法結束後jvm是不會回收這個變數的,也就不會釋放內存!」這個要看該變數的作用域(比如是否發生常見的方法或線程逃逸等情況)以及是否賦值為字面量(比如字元串字面量"XXX"在載入時會被拘留(intern)在運行時常量池中,而不會在方法結束後下次GC時被回收,但這與final修飾無關!) 等特殊情況,但其是否被回收與是否僅被final修飾無關!!

至於用final修飾類型(包括類和介面)或類的成員從JVM角度考慮就和上面的很不一樣了,比如你談到的被final修飾的方法,雖然從虛擬機規范層面上講也使用invokevirtual位元組碼調用,但其實它已經屬於非虛方法,在JVM的角度上完全可以(當然還要看具體JVM如何實現)用指向目標方法對象的指針來作為解析的結果(直接引用),而不用再通過虛方法表進行每次執行時的動態分派過程,從而提高運行效率。再比如你談到的內聯,就我所知不用final修飾的方法在運行時只要JVM判斷其滿足一定條件(比如常見的HotSpot虛擬機對「熱點」方法的判斷)時也會根據具體情況進行內聯(守護內聯機制或內聯緩存機制)這種基礎優化機制,這方面就不多說了。(有些跑題了,呵呵)

最後想說的就是不推薦僅為了有可能提高的一點執行效率而盡可能多的使用或者濫用final(同樣也適用於static等關鍵字),首先提升程序執行效率應該更多的從演算法復雜度、業務流程合理性、軟體架構合理性以及後期運行時環境調優上著手,而僅從某種語法內部運行機制上打主意意義不大!當然《Effective Java》中還是給出了不少關於使用java方面有意義的指引。其次不同的JVM產品或相同JVM產品不同版本或相同版本不同JVM配置參數都可能對同一語法機制在內部有不同的運行策略,很有可能原本希望提升執行效率的手段在某種運行時環境下卻成了瓶頸。再者就算不考慮代碼的可讀性和可維護性,但在注釋時又如何去說明僅為了提升性能而用的final或其他關鍵字呢?(當然可以忽視掉對它們的注釋,我想這也是造成樓主提問的原因。)

羅嗦了一大堆,也不知是否是你想談論的,希望對彼此有幫助吧。
個人看法,屬於原創,僅供參考,水平有限,錯誤難免,接受指正,謝謝。

③ perl能不能完全編譯成二進制代碼,提高執行效率

可以的,WINDOWS下的perl2exe工具可以把.pl文件編譯為獨立的.exe文件。

④ final,static,const在使用上有什麼區別

網上找到的,保留了 JAVA中final、staticfinal:final修飾類:該類不可繼承 final修飾方法:該方法不能被子類覆蓋(但它不能修飾構造函數) final修飾欄位屬性:屬性值第一次初始化後不能被修改 使用final可以提高程序執行的效率,將一個方法設成final後編譯器就可以把對那個方法的所有調用都置入嵌入調用里。 static:static修飾成員函數則該函數不能使用this對象 static不能修飾構造函數、函數參數、局部成員變數 static修飾成員欄位則當類被虛擬機載入時按照聲明先後順序對static成員欄位進行初始化。 static修飾語句塊:當類被虛擬機載入時按照聲明先後順序初始化static成員欄位和static語句塊 static所修飾的方法和欄位只屬於類,所有對象共享,java不能直接定義全局變數,是通過static來實現的。 java中沒有const,不能直接定義常量,是通過static final組合來實現的。 C#中readonly、const readonly、const是c#中的兩種常量 readonly:為運行時常量,程序運行時進行賦值,賦值完成後便無法更改,也稱為只讀變數。 const:為編譯時常量,程序編譯時將對常量值進行解析,並將所有常量引用替換為相應值。

⑤ final 修飾符能提升 Java 程序的性能嗎

對對象使用final,在編譯代碼時會將代碼inline,可以提高效率,且對象不可修改
但是要注意,數組類型不適合使用final進行修飾
舉個栗子:
public static final String[] a = {"","",""}
這里的a對象的子集是可修改對象,若要返回一個不可修改的數組可以寫一個函數返回數組

⑥ 怎麼可以提高vm虛擬機的運行效率我用來編譯安卓的,情況不允許我裝實體機

安卓要用VM么?eclipse就行啊

⑦ 如何優化JAVA代碼及提高執行效率

網站優化通常包含兩方面的內容:減小代碼的體積和提高代碼的運行效率。減小代碼的體積已經寫過太多這類的文章了,下面就簡單討論下如何提高代碼的效率。一、不用new關鍵詞創建類的實例用new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable介面,我們可以調用它的clone()方法。clone()方法不會調用任何類構造函數。在使用設計模式(DesignPattern)的場合,如果用Factory模式創建對象,則改用clone()方法創建新的對象實例非常簡單。二、使用非阻塞I/O版本較低的JDK不支持非阻塞I/OAPI。為避免I/O阻塞,一些應用採用了創建大量線程的辦法(在較好的情況下,會使用一個緩沖池)。這種技術可以在許多必須支持並發I/O流的應用中見到,如Web伺服器、報價和拍賣應用等。然而,創建Java線程需要相當可觀的開銷。JDK1.4引入了非阻塞的I/O庫(java.nio)。如果應用要求使用版本較早的JDK,需要支持非阻塞I/O的軟體包。三、慎用異常異常對性能不利。拋出異常首先要創建一個新的對象。Throwable介面的構造函數調用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常被拋出,VM就必須調整調用堆棧,因為在處理過程中創建了一個新的對象。異常只能用於錯誤處理,不應該用來控製程序流程。四、不要重復初始化變數默認情況下,調用類的構造函數時,Java會把變數初始化成確定的值:所有的對象被設置成null,整數變數(byte、short、int、long)設置成0,float和double變數設置成0.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵詞創建一個對象時,構造函數鏈中的所有構造函數都會被自動調用。五、盡量指定類的final修飾符帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高50%。六、盡量使用局部變數調用方法時傳遞的參數以及在調用中創建的臨時變數都保存在棧(Stack)中,速度較快。其他變數,如靜態變數、實例變數等,都在堆(Heap)中創建,速度較慢。另外,依賴於具體的編譯器/JVM,局部變數還可能得到進一步優化,望採納,謝謝。

⑧ Java中 為什麼定義為final的方法執行效率要高的啊

定義為final的方法,只編譯一次,也就是說,常量方法屬於類方法,而不是實例方法
而且在後期運行時,final方法是內嵌在程序中運行,而不是每次使用都去調用函數的副本
自然效率就出來了

⑨ 虛函數是可以內聯的,這樣就可以減少函數調用的開銷,提高效率

當然不能,虛函數意味在運行期確定函數的調用地址,內聯函數如同宏的用法一樣,相當於在編譯期把調用內聯的地方加上了函數實現的代碼。前者是動態的,後者是靜態的。
另外,即使編譯器通過了編譯,那麼函數也不可能是內聯的

⑩ 什麼工具可以提升gcc編譯效率

這個一般的工具應該還是做不到的,但是工具欄上應該還是有制動編譯的功效,你看一看。

熱點內容
安卓手機卸載更新什麼意思 發布:2024-04-24 19:29:35 瀏覽:227
文件des加密 發布:2024-04-24 19:24:20 瀏覽:705
魔獸世界data文件夾 發布:2024-04-24 19:24:13 瀏覽:214
蘋果手機怎麼清空緩存 發布:2024-04-24 19:23:38 瀏覽:893
微信密碼沒有手機號如何找回 發布:2024-04-24 19:18:20 瀏覽:875
微雲解析源碼 發布:2024-04-24 19:13:58 瀏覽:792
紙張記錄存儲 發布:2024-04-24 19:00:35 瀏覽:801
存儲結構中定義一個集合 發布:2024-04-24 18:52:05 瀏覽:428
搜狗網址存儲的密碼在哪裡查看 發布:2024-04-24 18:52:03 瀏覽:918
抖音搶福袋腳本最新 發布:2024-04-24 18:52:00 瀏覽:702