成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java比C++慢?看了測(cè)試結(jié)果,顛覆了我的認(rèn)知,不得不說JIT真的強(qiáng)

開發(fā) 后端
編程語(yǔ)言根據(jù)其抽象級(jí)別進(jìn)行分類。我們區(qū)分高級(jí)語(yǔ)言(Java,Python,JavaScript,C ++,Go),低級(jí)語(yǔ)言(匯編程序),最后是機(jī)器代碼。

 [[379539]]

本文轉(zhuǎn)載自微信公眾號(hào)「Java大廠面試官」,作者laker。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java大廠面試官公眾號(hào)。 

每一個(gè)優(yōu)秀的人,都有一段沉默的時(shí)光。那一段時(shí)光是付出了努力,忍受了孤獨(dú)和寂寞,日后說起時(shí),自己都被感動(dòng)的日子。

1. 概述

編程語(yǔ)言根據(jù)其抽象級(jí)別進(jìn)行分類。我們區(qū)分高級(jí)語(yǔ)言(Java,Python,JavaScript,C ++,Go),低級(jí)語(yǔ)言(匯編程序),最后是機(jī)器代碼。

每個(gè)高級(jí)語(yǔ)言代碼(例如Java)都需要轉(zhuǎn)換為機(jī)器本地代碼才能執(zhí)行。該翻譯過程可以是編譯或解釋。但是,還有第三種選擇。試圖利用兩種方法的組合。

2. 編譯與解釋

讓我們開始研究編譯和解釋語(yǔ)言之間的一些差異。

2.1 編譯語(yǔ)言

編譯器將編譯語(yǔ)言(C ++,Go)直接轉(zhuǎn)換為機(jī)器碼。

在執(zhí)行之前,它們需要明確的構(gòu)建步驟。這就是為什么每次更改代碼時(shí)都需要重新編譯程序。

編譯語(yǔ)言往往比解釋語(yǔ)言更快,更有效。但是,它們生成的機(jī)器碼是特定于平臺(tái)的。

2.2 解釋語(yǔ)言

在解釋語(yǔ)言(Python,JavaScript)中,沒有構(gòu)建步驟。相反,解釋器在執(zhí)行程序時(shí)對(duì)程序的源代碼進(jìn)行操作。

曾經(jīng)認(rèn)為解釋語(yǔ)言比編譯語(yǔ)言要慢得多。但是,隨著即時(shí)編譯(JIT)的發(fā)展,性能差距正在縮小。JIT編譯器在程序運(yùn)行時(shí)將代碼從解釋語(yǔ)言轉(zhuǎn)換為機(jī)器碼。

此外,我們可以在Windows,Linux或Mac等多個(gè)平臺(tái)上執(zhí)行解釋后的語(yǔ)言代碼。解釋代碼與特定類型的CPU體系結(jié)構(gòu)沒有關(guān)聯(lián)。

3. Write Once Run Anywhere

Java和JVM在設(shè)計(jì)時(shí)考慮了可移植性。因此,當(dāng)今大多數(shù)流行的平臺(tái)都可以運(yùn)行Java代碼。

這聽起來(lái)似乎暗示著Java是一種純解釋性語(yǔ)言。但是,在執(zhí)行之前,需要將Java源代碼編譯為字節(jié)碼。字節(jié)碼是JVM固有的一種特殊機(jī)器語(yǔ)言。JVM在運(yùn)行時(shí)解釋并執(zhí)行此代碼。

它是JVM為支持Java的每個(gè)平臺(tái)構(gòu)建和定制的,并不是我們的程序或庫(kù)。

JVM也具有JIT編譯器。這意味著JVM在運(yùn)行時(shí)優(yōu)化我們的代碼,以獲得與編譯語(yǔ)言相似的性能優(yōu)勢(shì)。

4. Java編譯器

javac的命令行工具把Java源代碼編譯轉(zhuǎn)換成Java類文件(xxx.class)與平臺(tái)無(wú)關(guān)的字節(jié)碼:

  1. $ javac HelloWorld.java 

源代碼文件帶有.java后綴,而包含字節(jié)碼的類文件則帶有.class后綴。

5. Java虛擬機(jī)

編譯的類文件(字節(jié)碼),可以由JVM執(zhí)行:

  1. $ java HelloWorld 
  2. Hello Java! 

在運(yùn)行時(shí)如何將字節(jié)碼轉(zhuǎn)換為機(jī)器本機(jī)代碼。

5.1 架構(gòu)概述

JVM由五部分組成:

  • 類加載器
  • JVM內(nèi)存結(jié)構(gòu)
  • 執(zhí)行引擎
  • 本地方法接口
  • 本地方法庫(kù)

5.2 類加載器

JVM利用ClassLoader將已編譯的類文件加載到JVM內(nèi)存

除加載外,ClassLoader還執(zhí)行鏈接和初始化。

  • 驗(yàn)證字節(jié)碼是否存在安全漏洞
  • 為靜態(tài)變量分配內(nèi)存
  • 用原始引用替換符號(hào)內(nèi)存引用
  • 將原始值分配給靜態(tài)變量
  • 執(zhí)行所有靜態(tài)代碼塊

5.3 執(zhí)行引擎

執(zhí)行引擎負(fù)責(zé)讀取字節(jié)碼,將其轉(zhuǎn)換為機(jī)器本機(jī)代碼并執(zhí)行。

三個(gè)主要組件負(fù)責(zé)執(zhí)行,包括解釋器和編譯器:

  • 由于JVM與平臺(tái)無(wú)關(guān),因此它使用解釋器執(zhí)行字節(jié)碼
  • JIT編譯器在重復(fù)的方法調(diào)用處,把字節(jié)碼編譯為本地代碼以提高性能。
  • 垃圾收集器收集并刪除所有未引用的對(duì)象。

執(zhí)行引擎利用本機(jī)方法接口(JNI)來(lái)調(diào)用本地庫(kù)和應(yīng)用程序。

5.4 即時(shí)編譯器(JIT)

解釋器的主要缺點(diǎn)是:每次調(diào)用方法時(shí),都需要解釋執(zhí)行,這比編譯的本機(jī)代碼要慢。Java使用JIT編譯器來(lái)克服此問題。

JIT編譯器不能完全替代解釋器。執(zhí)行引擎仍在使用它。但是,JVM根據(jù)調(diào)用方法的頻率使用JIT編譯器。

JIT編譯器將整個(gè)方法的字節(jié)碼編譯為機(jī)器本機(jī)代碼,因此可以直接重用。與標(biāo)準(zhǔn)編譯器一樣,生成中間代碼,進(jìn)行優(yōu)化,然后生成機(jī)器本機(jī)代碼。

探查器是JIT編譯器的特殊組件,負(fù)責(zé)查找熱點(diǎn)。JVM根據(jù)運(yùn)行時(shí)收集的性能分析信息來(lái)決定要編譯的代碼。

這樣的效果是,經(jīng)過幾個(gè)執(zhí)行周期,Java程序可以更快地執(zhí)行其工作。JVM了解到熱點(diǎn)后,便可以創(chuàng)建本機(jī)代碼,從而使運(yùn)行速度更快。

6. 性能比較

讓我們看一下JIT編譯如何提高Java的運(yùn)行時(shí)性能。

6.1 斐波那契數(shù)列性能測(cè)試

我們將使用一種簡(jiǎn)單的遞歸方法來(lái)計(jì)算第n個(gè)斐波那契數(shù):

  1. private static int fibonacci(int index) { 
  2.     if (index <= 1) { 
  3.         return index
  4.     } 
  5.     return fibonacci(index-1) + fibonacci(index-2); 

為了衡量重復(fù)方法調(diào)用的性能收益,我們將運(yùn)行Fibonacci方法100次:

  1. for (int i = 0; i < 100; i++) { 
  2.     long startTime = System.nanoTime(); 
  3.     int result = fibonacci(12); 
  4.     long totalTime = System.nanoTime() - startTime; 
  5.     System.out.println(totalTime); 

首先,我們將正常編譯并執(zhí)行Java代碼:

  1. $ java Fibonacci.java 

然后,我們將在禁用JIT編譯器的情況下執(zhí)行相同的代碼:

  1. $ java -Djava.compiler=NONE Fibonacci.java 

最后,我們將在C ++和JavaScript中實(shí)現(xiàn)并運(yùn)行相同的算法進(jìn)行比較。

6.2 性能測(cè)試結(jié)果

讓我們看一下運(yùn)行斐波那契數(shù)列測(cè)試后以納秒為單位測(cè)量的平均性能:

  • 使用JIT編譯器的Java – 2726 ns –最快
  • 沒有JIT編譯器的Java – 17965 ns –慢559%
  • 沒有O2優(yōu)化的C ++ – 9435 ns –降低246%
  • 具有O2優(yōu)化的C ++ – 3639 ns –慢33%
  • JavaScript – 22998 ns –慢743%

在此示例中,使用JIT編譯器,Java的性能提高了500%以上。但是,JIT編譯器確實(shí)需要運(yùn)行一些才能運(yùn)行。

有趣的是,即使在啟用O2優(yōu)化標(biāo)志的情況下編譯C ++,Java的性能也比C ++代碼好33%。當(dāng)仍在解釋Java時(shí),C ++在前幾次運(yùn)行中的性能要好得多。

Java還勝過與Node一起運(yùn)行的等效JavaScript代碼,后者也使用JIT編譯器。結(jié)果顯示性能提高了700%以上。主要原因是Java的JIT編譯器啟動(dòng)速度更快。

7. 思考

從技術(shù)上講,可以將任何靜態(tài)編程語(yǔ)言代碼直接編譯為機(jī)器代碼。也可以逐步解釋任何編程代碼。

與許多其他現(xiàn)代編程語(yǔ)言類似,Java使用編譯器和解釋器的組合。目標(biāo)是利用兩全其美,實(shí)現(xiàn)高性能和平臺(tái)無(wú)關(guān)的執(zhí)行。

在本文中,我們重點(diǎn)介紹了HotSpot中的工作方式。HotSpot是Oracle默認(rèn)的開源JVM實(shí)現(xiàn)。Graal VM也基于HotSpot,因此適用相同的原理。

如今,最流行的JVM實(shí)現(xiàn)使用解釋器和JIT編譯器的組合。但是,其中一些也可能使用其他方式。

8. 結(jié)論

Java使用了兩種方法的組合。

我們用Java編寫的源代碼在構(gòu)建過程中首先被編譯為字節(jié)碼。然后,JVM解釋生成的字節(jié)碼以供執(zhí)行。但是,JVM還在運(yùn)行時(shí)使用JIT編譯器來(lái)提高性能。

翻譯于:

https://www.baeldung.com/java-compiled-interpreted

 

責(zé)任編輯:武曉燕 來(lái)源: Java大廠面試官
相關(guān)推薦

2011-04-27 10:31:29

兼容墨盒用戶體驗(yàn)

2019-12-24 14:04:59

PythonExcel數(shù)據(jù)處理

2019-10-18 17:55:03

安全運(yùn)營(yíng)

2020-06-15 08:19:00

ZooKeeperEureka

2019-11-14 15:38:46

AndroidRelease項(xiàng)目

2015-08-31 14:12:12

DockerKubernetesPaaS

2011-04-26 09:44:05

Power Cloud

2018-08-06 11:59:00

混合云數(shù)據(jù)中心上云

2010-05-26 15:17:06

Windows Emb

2015-02-05 09:32:19

單元測(cè)試

2011-05-31 09:29:31

C++Linus Torva

2009-11-11 16:48:29

Visual C++

2024-04-26 08:32:01

2024-02-04 00:00:03

運(yùn)維Linux磁盤

2014-10-21 11:05:52

英特爾Linux

2015-01-16 16:44:50

2014-04-15 10:18:24

中文女工科男

2012-10-31 10:07:00

JS前端Web

2012-10-31 10:36:17

js前端JavaScript頁(yè)面構(gòu)建

2010-08-27 10:37:43

無(wú)線標(biāo)準(zhǔn)WAPI
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91精品国产综合久久久动漫日韩 | 久久久久久久国产 | 精品欧美一区二区精品久久久 | 国产午夜精品理论片a大结局 | 一区二区三区视频 | 国产精品色哟哟网站 | 欧美 日韩 中文 | 日韩视频一区二区 | 羞羞网站在线观看 | 亭亭五月激情 | 黄色男女网站 | 精品欧美乱码久久久久久1区2区 | 免费高潮视频95在线观看网站 | 欧美在线一区二区三区四区 | 成人免费视频 | 久久一区 | 欧美日韩在线精品 | 天天干 夜夜操 | 国产一区二区三区四区hd | 欧美天堂在线 | 蜜桃臀av一区二区三区 | 午夜av影院 | 综合色播 | 亚洲一区二区三 | 天天综合久久 | 国产高清av免费观看 | 精品国产精品一区二区夜夜嗨 | 狠狠综合久久av一区二区小说 | 午夜影院在线观看 | 国产欧美二区 | 成人一区二区视频 | 欧美三级在线 | 精品国产乱码久久久久久88av | 国产精品久久福利 | a久久久久久 | 亚洲国产精品一区在线观看 | 国产精品高清一区二区三区 | 久久综合久 | 日韩电影免费在线观看中文字幕 | 久久精品视频亚洲 | 亚洲在线视频 |