日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

您是否能及时编译?

發(fā)布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 您是否能及时编译? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

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

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

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

JVM中負(fù)責(zé)這些優(yōu)化的組件稱為即時編譯器(JIT)。 它利用了有趣的程序?qū)傩浴?實(shí)際上,所有程序都將大部分時間都花在執(zhí)行少量代碼上。 Java HotSpot VM不會及時編譯所有代碼,而是立即使用解釋器運(yùn)行程序,并在運(yùn)行時分析代碼以檢測程序中的關(guān)鍵熱點(diǎn)。 然后,它將全球本地代碼優(yōu)化器的注意力集中在熱點(diǎn)上。 通過避免不經(jīng)常執(zhí)行的代碼的編譯,Java HotSpot編譯器可以更加關(guān)注程序的性能關(guān)鍵部分。 這意味著您的編譯時間總體上不會增加??。 該熱點(diǎn)監(jiān)視將在程序運(yùn)行時動態(tài)地繼續(xù)進(jìn)行,以便根據(jù)您的應(yīng)用程序的使用模式即時調(diào)整其性能。

JIT通過多種技術(shù)來實(shí)現(xiàn)性能優(yōu)勢,例如消除無效代碼,繞過邊界條件檢查,消除冗余負(fù)載,內(nèi)聯(lián)方法等。

以下示例說明了JIT用來實(shí)現(xiàn)更好性能的那些技術(shù)。 在第一部分中,有開發(fā)人員編寫的代碼。 在第二個代碼段中,是在熱點(diǎn)檢測到“熱點(diǎn)”并應(yīng)用了優(yōu)化魔術(shù)之后執(zhí)行的代碼:

  • 未優(yōu)化的代碼。
  • 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;} }
  • 優(yōu)化代碼
  • class Calculator {Wrapper wrapper;public void calculate() {y = wrapper.value;sum = y + y;} }class Wrapper {final int value;final int get() {return value;} }
  • 上面的小樣本中描述的第一類是開發(fā)人員編寫的類,第二類是JIT完成工作之后的示例。 該示例包含一些應(yīng)用的優(yōu)化技術(shù)。 讓我們看一下如何達(dá)到最終結(jié)果:

  • 未優(yōu)化的代碼。 這是在被檢測為熱點(diǎn)之前正在運(yùn)行的代碼:
  • public void calculate() {y = wrapper.get();z = wrapper.get();sum = y + z; }
  • 內(nèi)聯(lián)方法。 wrapper.get()已被b.value取代,因?yàn)橥ㄟ^直接訪問wrapper.value而不是通過函數(shù)調(diào)用來減少延遲。
  • public void calculate() {y = wrapper.value;z = wrapper.value;sum = y + z; }
  • 卸下多余的負(fù)載。 z = wrapper.value已替換為z = y,以便通過訪問局部值而不是wrapper.value來減少延遲。
  • public void calculate() {y = wrapper.value;z = y;sum = y + z; }
  • 復(fù)制傳播。 z = y已由y = y代替,因?yàn)闆]有多余的變量z,因?yàn)閦和y的值相等。
  • public void calculate() {y = wrapper.value;y = y;sum = y + y; }
  • 消除無效代碼。 y = y是不必要的,可以消除。
  • public void calculate() {y = wrapper.value;sum = y + y; }
  • 這個小樣本包含JIT用來提高代碼性能的幾種強(qiáng)大技術(shù)。 希望它對理解這個強(qiáng)大的概念很有幫助。
    喜歡這個職位嗎? 我們還有很多工作要做。 訂閱我們的RSS feed或Twitter流并享受。

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

    • 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

    總結(jié)

    以上是生活随笔為你收集整理的您是否能及时编译?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。