您是否能及時編譯?

還記得上次被C開發人員嘲笑的時候嗎? Java如此繁瑣,以至于他們甚至都不會考慮使用這種語言?

在許多方面,這一概念仍然成立。 但是對于典型的用法(在大型企業的骨干中),Java性能絕對可以與許多競爭者抗衡。 這在很大程度上要歸功于神奇的JIT。

在深入解釋“即時”編譯技巧之前,讓我們深入了解一下背景知識。

您可能還記得– Java是一種解釋型語言。 大多數用戶都知道的Java編譯器javac不會像C編譯器那樣直接將Java源文件編譯為處理器指令。 而是生成字節碼,這是由規范控制的與機器無關的二進制格式。 JVM在運行時解釋該字節碼。這是Java在跨平臺上如此成功的主要原因-您可以在一個平臺上編寫和構建程序,然后在其他平臺上運行。 Just in Time 另一方面,它確實引入了一些負面方面。 其中最嚴重的事實之一是,解釋的代碼通常比直接編譯為平臺特定的本機二進制代碼的代碼要慢。 Sun雇用Cliff Click博士提供解決方案時,已經在90年代末意識到了這種嚴重性。

歡迎– HotSpot 。 該名稱源自JVM識別應用程序中“熱點”(經常執行的字節代碼塊)的功能。 然后將它們作為目標,以進行廣泛的優化并將其編譯為處理器專用指令。 通過優化,可以以最少的開銷實現對性能要求較低的代碼的高性能執行。 在某些情況下, JVM的自適應優化有可能超過手工編碼的C ++或C代碼的性能。

JVM中負責這些優化的組件稱為即時編譯器(JIT)。 它利用了有趣的程序屬性。 實際上,所有程序都將大部分時間都花在執行少量代碼上。 Java HotSpot VM不會及時編譯所有代碼,而是立即使用解釋器運行程序,并在運行時分析代碼以檢測程序中的關鍵熱點。 然后,它將全球本地代碼優化器的注意力集中在熱點上。 通過避免不經常執行的代碼的編譯,Java HotSpot編譯器可以更加關注程序的性能關鍵部分。 這意味著您的編譯時間總體上不會增加??。 該熱點監視將在程序運行時動態地繼續進行,以便根據您的應用程序的使用模式即時調整其性能。

JIT通過多種技術來實現性能優勢,例如消除無效代碼,繞過邊界條件檢查,消除冗余負載,內聯方法等。

以下示例說明了JIT用來實現更好性能的那些技術。 在第一部分中,有開發人員編寫的代碼。 在第二個代碼段中,是在熱點檢測到“熱點”并應用了優化魔術之后執行的代碼:

  1. 未優化的代碼。
  2. class Calculator {Wrapper wrapper;public void calculate() {y = wrapper.get();z = wrapper.get();sum = y + z;}
    }class Wrapper {final int value;final int get() {return value;}
    }
  3. 優化代碼
  4. class Calculator {Wrapper wrapper;public void calculate() {y = wrapper.value;sum = y + y;}
    }class Wrapper {final int value;final int get() {return value;}
    }

上面的小樣本中描述的第一類是開發人員編寫的類,第二類是JIT完成工作之后的示例。 該示例包含一些應用的優化技術。 讓我們看一下如何達到最終結果:

  1. 未優化的代碼。 這是在被檢測為熱點之前正在運行的代碼:
  2. public void calculate() {y = wrapper.get();z = wrapper.get();sum = y + z;
    }
  3. 內聯方法。 wrapper.get()已被b.value取代,因為通過直接訪問wrapper.value而不是通過函數調用來減少延遲。
  4. public void calculate() {y = wrapper.value;z = wrapper.value;sum = y + z;
    }
  5. 卸下多余的負載。 z = wrapper.value已替換為z = y,以便通過訪問局部值而不是wrapper.value來減少延遲。
  6. public void calculate() {y = wrapper.value;z = y;sum = y + z;
    }
  7. 復制傳播。 z = y已由y = y代替,因為沒有多余的變量z,因為zy的值相等。
  8. public void calculate() {y = wrapper.value;y = y;sum = y + y;
    }
  9. 消除無效代碼。 y = y是不必要的,可以消除。
  10. public void calculate() {y = wrapper.value;sum = y + y;
    }

這個小樣本包含JIT用來提高代碼性能的幾種強大技術。 希望它對理解這個強大的概念很有幫助。
喜歡這個職位嗎? 我們還有很多工作要做。 訂閱我們的RSS feed或Twitter流并享受。

本文使用了以下相關鏈接(兩個憤怒的C開發人員除外):

  • http://www.oracle.com/technetwork/java/whitepaper-135217.html
  • http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136373.html
  • http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/underst_jit.html

參考: 您是否能及時編譯? 由我們的JCG合作伙伴 Nikita Salnikov Tarnovski在Plumbr Blog博客上獲得。

翻譯自: https://www.javacodegeeks.com/2012/12/do-you-get-just-in-time-compilation.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370156.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370156.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370156.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言作業二選擇結構,C語言第二次作業參考答案選擇結構.pdf

1 C 語言第二次作業(選擇結構)參考答案語言第二次作業(選擇結構)參考答案 1、某年如果能被某年如果能被 4 整除整除,,但不能被但不能被 100 整除整除,,或者能被或者能被 400 整除的整除的 年是閏年。判斷從鍵盤輸入的年份是否為閏…

2d物理引擎01

我一直想做一個游戲&#xff0c;但一直感覺自己水平不夠 想了想覺得不去做的話就永遠做不出來 所以有了這個博文 01 我需要一個東西來顯示&#xff0c;很顯然h5中canvas是很好的選擇 <!DOCTYPE html> <html><head><meta charset"utf-8" />&l…

python結課設計力學方面_我對力學教案的評價

這是來自某教學網站的高一物理力學教案&#xff1a;[高一物理教案1.1.1]第一章 力1&#xff0e;1 力一、教學目標1&#xff0e;知識目標⑴知道力是物體對物體的作用&#xff0c;力不能脫離物體而存在&#xff1b;能正確找出受力物體和施力物體。⑵知道力是有方向的量&#xff…

Liferay Model Hints

這篇文章主要介紹如何通過model hint 來修改liferay builder service生成數據庫表中默認字段的長度。 1.什么是Model Hints? 它是對liferay builder service生成的model類的基本提示. 2. 它在什么地方被定義的&#xff1f; portlet-model-hints.xml 3. 文件位置&#xff1f; /…

瀏覽器書簽備份管理

1、火狐瀏覽器備份導出HTML文件&#xff1a; CtrlJ 書簽 - 導入/導出 2、谷歌瀏覽器&#xff1a; 設置中 導入書簽 轉載于:https://www.cnblogs.com/AmbiguousMiao/p/8084721.html

選擇您的收藏庫

這真的是您應該煩惱的嗎&#xff1f; java.util.ArrayList和java.util.HashMap從根本上有問題嗎&#xff1f; 對于大多數源代碼&#xff0c;答案是–不&#xff1b; 這些實現完全可以。 但是&#xff0c;一如既往&#xff0c;細節決定成敗。 并存在情況下&#xff0c;當是內置…

里公式后面標號怎么對齊_你若會用Word里F4鍵,又何須加班到半夜?

F4鍵在Word里面表示重復上一個操作&#xff0c;但對于這個快捷鍵&#xff0c;你真的會操作嗎&#xff1f;本期與大家分享這個神奇的F4鍵&#xff0c;助你高效工作。1、批量復制文本在一般情況下&#xff0c;我們是用CtrlC復制內容&#xff0c;CtrlV粘貼內容&#xff0c;但遇到特…

全方位分析web前端如何進行性能優化

前言&#xff1a; 最近剛剛完成項目&#xff0c;空閑一段時間&#xff0c;想起之前有被問起怎么對前端進行性能優化&#xff0c;自己也是腦中零零散散的總不成體系&#xff0c;現特來總結&#xff0c;歡迎補充指教。 1、整體資源 &#xff08;1&#xff09;js、css源碼壓縮 &a…

DshanMCU-R128s2 SDK 架構與目錄結構

R128 S2 是全志提供的一款 M33(ARM)C906(RISCV-64)HIFI5(Xtensa) 三核異構 SoC&#xff0c;同時芯片內部 SIP 有 1M SRAM、8M LSPSRAM、8M HSPSRAM 以及 16M NORFLASH。 本文檔作為 R128 FreeRTOS SDK 開發指南&#xff0c;旨在幫助軟件開發工程師、技術支持工程師快速上手&am…

數據導出

數據導出和數據導入剛好是相反的&#xff0c;把邏輯反過來就可以了。 源碼&#xff1a;https://github.com/SeaLee02/FunctionModule/blob/master/UploadFiles/WebDemo/COM/DataToOut.aspx 效果&#xff1a; 然后勾選需要導出的數據&#xff0c;生成Excel 部分前臺&#xff1a;…

c語言清空輸入緩沖區函數,c語言:C語言清空輸入緩沖區在標準輸入(stdin)情況 -電腦資料...

C語言清空輸入緩沖區在標準輸入(stdin)情況下的使用程序1&#xff1a;//功能&#xff1a;先輸入一個數字&#xff0c;再輸入一個字符&#xff0c;輸出hello bit#include int main(){int num 0;char ch ;scanf("%d", &num);scanf("%c", &ch);pri…

Spring MVC 3:上傳多個文件

只是在辦公室又漫長的一天&#xff0c;數據庫不可用&#xff0c;一個團隊成員現在滯后一周。 因此&#xff0c;我們必須作為一個團隊來交付它。 在Spring3&#xff0c;它看起來很直接上傳文件。 但是&#xff0c;從jsp文件上載多個文件幾乎沒有幫助。 上載多個文件需要完成三件…

spring 事務隔離級別和傳播行為_Spring事務傳播性與隔離性實戰

一、事務傳播性1.1 什么是事務的傳播性事務的傳播性一般在事務嵌套時候使用&#xff0c;比如在事務A里面調用了另外一個使用事務的方法&#xff0c;那么這倆個事務是各自作為獨立的事務執行提交&#xff0c;還是內層的事務合并到外層的事務一塊提交那&#xff0c;這就是事務傳播…

前端為什么非要動靜分離 說一下CDN托管的意義

大型Web應用對速度的追求并沒有止步于僅僅利用瀏覽器緩存&#xff0c;因為瀏覽器緩存始終只是為了提升二次訪問的速度&#xff0c;對于首次訪問的加速&#xff0c;我們需要從網絡層面進行優化&#xff0c;最常見的手段就是CDN&#xff08;Content Delivery Network&#xff0c;…

unity語音聊天之 www.GetAudioClip

最近在開發語音聊天功能,游戲需要跨平臺安卓與ios&#xff0c;上傳本地錄制的wav文件至服務器后&#xff0c;需要根據服務器返回的地址進行語音文件的下載并進行播放。 這里通過使用www進行下載并播放 其中在ios播放時卻不行了&#xff0c;查詢官方文檔后發現&#xff0c;ios必…

輕談BFC

BFC 定義 CSS2.1的定義 Block formatting contexts 9.4.1 Block formatting contexts Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, and table-captions) that are not block boxes, and block boxes with overflow other …

Java中的Selenium / WebDriver示例

幾年前&#xff0c;我正在忙于一些工作&#xff0c;客戶希望了解如何解決現實世界中的問題。 他們要求我自動化woot.com網站上的某些任務。 他們的任務是訪問各個網站&#xff0c;并閱讀當天商品的名稱和價格。 我寫了一些Selenium代碼&#xff0c;以為可以將其張貼在這里&am…

c語言中怎樣實現空格的替換,C語言實現去除字符串中空格的簡單實例

在網上看了些去除空格的代碼,覺得都不是很簡潔,就自己寫代碼實現它本著高效率,不使用額外存儲空間的想法實現該功能去除空格一共有三種&#xff1a;1、去除全部空格&#xff1b;2、一種是去除左邊空格&#xff1b;3、去除右邊空格想去除左右兩邊空格&#xff0c;只要先去除左邊…

python消息隊列中間件_python-RabbtiMQ消息隊列

1.RabbitMQ簡介AMQP&#xff0c;即Advanced Message Queuing Protocol&#xff0c;高級消息隊列協議&#xff0c;是應用層協議的一個開放標準&#xff0c;為面向消息的中間件設計。消息中間件主要用于組件之間的解耦&#xff0c;消息的發送者無需知道消息使用者的存在&#xff…

CSS position(定位)屬性

關于CSS position&#xff0c;來自MDN的描述&#xff1a; CSS position屬性用于指定一個元素在文檔中的定位方式。top、right、bottom、left 屬性則決定了該元素的最終位置。 然后來看看什么是文檔流(normal flow)&#xff0c;下面是 www.w3.org 的描述&#xff1a; Normal flo…