偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

瀏覽器辭典:V8

系統(tǒng) 瀏覽器
V8是Chrome的JavaScript引擎,用C++開(kāi)發(fā),基于ECMA-262第3版標(biāo)準(zhǔn)。V8的團(tuán)隊(duì)說(shuō)Chrome對(duì)腳本的解析和執(zhí)行速度是Firefox和Safari的10倍,是IE的56倍。

V8:Chrome的JavaScript引擎,用C++開(kāi)發(fā),基于ECMA-262第3版標(biāo)準(zhǔn)。作為一個(gè)開(kāi)源項(xiàng)目,任何人都可以參加。項(xiàng)目地址在Google Code:http://code.google.com/p/v8/

Chrome V8設(shè)計(jì)

自從十九世紀(jì)九十年底中,Netscape瀏覽器集成了JavaScript,它使得web開(kāi)發(fā)者更加容易訪問(wèn)HTML頁(yè)面元素如:表單、frames和圖象。JavaScript迅速流行,用于定制控件和增加動(dòng)畫(huà)效果。到19世紀(jì)九十年代后,出現(xiàn)大量的用于切換圖片以響應(yīng)用戶生成的鼠標(biāo)事件的腳本。

最近,隨著AJAX的出現(xiàn),JavaScript已經(jīng)稱為了實(shí)現(xiàn)基于web的應(yīng)用(如:Gmail)的中心技術(shù)。JavaScript程序由簡(jiǎn)單的幾行成長(zhǎng)為幾百k的源碼。然而JavaScript是被設(shè)計(jì)成實(shí)現(xiàn)web應(yīng)用的非常有效的技術(shù)。性能已經(jīng)成為開(kāi)發(fā)基于web的 JavaScript應(yīng)用的限制因素。

V8是全新的JavaScript引擎,主要設(shè)計(jì)目標(biāo)是快速執(zhí)行大量JavaScript腳本應(yīng)用。在幾種benchmark測(cè)試中,V8的性能是JScript(IE內(nèi)的引擎)、SpiderMonkey(Firefox所用)和 JavaScriptCore(safari所用)的許多倍。如果您的web應(yīng)用受限于JavaScript的執(zhí)行速度,則使用V8代替您當(dāng)前的 JavaScript引擎將很可能提高您的應(yīng)用的性能。性能提升的程度依賴于JavaScript的多少和JavaScript的特點(diǎn)。例如,如果在您的應(yīng)用中函數(shù)傾向于一次一次被執(zhí)行,則與僅執(zhí)行一次許多不同函數(shù)相比性能將大大地提升。當(dāng)您閱讀完本文檔時(shí),您將更加清楚性能提升的原因。

V8性能的3個(gè)關(guān)鍵方面:

◆快速屬性訪問(wèn)

◆動(dòng)態(tài)生成機(jī)器碼

◆高效的垃圾回收

快速屬性訪問(wèn)

JavaScript是動(dòng)態(tài)的編程語(yǔ)言:對(duì)象的屬性可以增加和刪除。這意味著一個(gè)對(duì)象的屬性可能改變。大多數(shù)JavaScript引擎使用類似字典的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)對(duì)象的屬性,每個(gè)屬性的訪問(wèn)需要?jiǎng)討B(tài)查找定位屬性在內(nèi)存的位置。這種典型的訪問(wèn)屬性方法比在Java和Smalltalk中訪問(wèn)實(shí)例化變量慢得多。在這些語(yǔ)言中,實(shí)例化變量通過(guò)由編譯器決定的根據(jù)對(duì)象類型定義的對(duì)象固定的布局定義的固定的偏移來(lái)定位。加載或存儲(chǔ)訪問(wèn)非常簡(jiǎn)單,通常僅僅需要一條簡(jiǎn)單點(diǎn)的指令。

為了減少訪問(wèn)JavaScript屬性的時(shí)間,V8沒(méi)有使用動(dòng)態(tài)查找訪問(wèn)屬性,取而代之的是V8動(dòng)態(tài)創(chuàng)建后臺(tái)隱藏的類。這個(gè)想法不是最新才有的-是基于原型的編程語(yǔ)言自身的特性(相似地用于映射某些東西)(見(jiàn)An Efficient Implementation of Self, a Dynamiclly-Typed Object-Oriented Language Based on Prototypes)。在V8中,當(dāng)一個(gè)新的屬性增加時(shí),對(duì)象改變它的隱藏類。

為了更加清除說(shuō)明這一個(gè)點(diǎn),想象如下一個(gè)的簡(jiǎn)單的JavaScript函數(shù):

function Point(x, y) {  this.x = x;  this.y = y; }

當(dāng)new Point(x, y)被執(zhí)行時(shí)一個(gè)新的Point對(duì)象被創(chuàng)建。當(dāng)V8首次創(chuàng)建時(shí),V8創(chuàng)建一個(gè)初始的隱藏類Point,例子中稱為C0。如果對(duì)象初始時(shí)沒(méi)有任何屬性則定義空的初始類。此處Point對(duì)象的隱藏的類是C0。

執(zhí)行在Point里第一個(gè)語(yǔ)句(this.x = x;)則在Point對(duì)象中創(chuàng)建一個(gè)新的屬性x, 這種情況下V8:

  1. 基于C0創(chuàng)建另外一個(gè)的隱藏類C1, 然后增加描述有屬性x的信息給C1,這個(gè)屬性的值存在Point對(duì)象偏移為0的位置。
  2. 如果一個(gè)x屬性添加到C0描述的對(duì)象上那么隱藏類C1應(yīng)該取代C0,同時(shí)更新C0以表示前面的過(guò)渡。此時(shí)Point對(duì)象的隱藏類是C1。 

執(zhí)行Point的第二個(gè)語(yǔ)句(this.y = y; ),則在Point對(duì)象中創(chuàng)建一個(gè)新的屬性y,這種情況下V8:

  1. 基于C1創(chuàng)建另外一個(gè)隱藏類C2,然后添加描述屬性y的信息給C2,同時(shí)屬性值在Point對(duì)象的偏移為1。
  2. 如果一個(gè)y屬性添加到C1描述的對(duì)象上那么隱藏類C2應(yīng)該取代C1,同時(shí)更新C1以表示前面的過(guò)渡。此時(shí)Point對(duì)象的隱藏類是C2。 

無(wú)論何時(shí)增加屬性,以上似乎通過(guò)創(chuàng)建一個(gè)隱藏類不是很高效。然而由于類的過(guò)渡,隱藏類可以重用,實(shí)際的效率較高。第二次創(chuàng)建一個(gè)新的Point時(shí)是不需要?jiǎng)?chuàng)建新的隱藏類,相反新的Point對(duì)象共享了第一個(gè)Point對(duì)象的類型。例如,如果創(chuàng)建另外一個(gè)Point對(duì)象:

  1. 初始的Point對(duì)象沒(méi)有屬性,因此最新建的對(duì)象引用初始類C0。
  2. 當(dāng)增加屬性x,V8遵循隱藏類從C0到C1過(guò)渡。并根據(jù)C1中x的偏移寫(xiě)入x的值。
  3. 當(dāng)增加屬性y,V8遵循隱藏類從C1到C2過(guò)渡。并根據(jù)C2中y的偏移寫(xiě)入y的值。

盡管JavaScript比通常的面向?qū)ο蟮恼Z(yǔ)言更加動(dòng)態(tài),使用上面方法通常的JavaScript程序的運(yùn)行時(shí)行為將導(dǎo)致高度的結(jié)構(gòu)貢獻(xiàn)。這里列舉使用隱藏類的兩個(gè)優(yōu)點(diǎn):屬性訪問(wèn)不需要字典查找,同時(shí)使得V8能使用面向?qū)ο蟮膬?yōu)化,內(nèi)聯(lián)緩存。更多的內(nèi)聯(lián)緩存見(jiàn)Efficent Implementation of the Smalltalk-80 System。

動(dòng)態(tài)生成機(jī)器指令

首次執(zhí)行時(shí),V8直接將JavaScript源碼編譯成機(jī)器碼。不存在中間過(guò)程的字節(jié)碼,沒(méi)有解釋器。訪問(wèn)屬性通過(guò)處理內(nèi)聯(lián)的緩存代碼,這些代碼可以像V8執(zhí)行時(shí)一樣轉(zhuǎn)為的其他機(jī)器指令。

在首次訪問(wèn)一個(gè)給定對(duì)象的屬性時(shí),V8生成了對(duì)象當(dāng)前的隱藏類。V8使用隱藏類內(nèi)部生成內(nèi)聯(lián)緩存信息并通過(guò)預(yù)測(cè)這個(gè)類是否將用于在同一節(jié)代碼的所有將來(lái)的對(duì)象來(lái)優(yōu)化屬性的訪問(wèn)。如果V8成功預(yù)測(cè)則屬性的值將用一個(gè)簡(jiǎn)單的操作讀取或者寫(xiě)入。如果預(yù)測(cè)不正確,則V8將刪除被優(yōu)化的代碼。

例如,JavaScript代碼訪問(wèn)Point對(duì)象的屬性x:

point.x

在V8中,訪問(wèn)x的機(jī)器碼是:

# ebx = the point object
cmp [ebx,<hidden class offset>],<cached hidden class>
jne <inline cache miss>
mov eax,[ebx, <cached x offset>]

如果對(duì)象的隱藏類不匹配緩存的隱藏類,則執(zhí)行跳轉(zhuǎn)到V8運(yùn)行時(shí)系統(tǒng)處理內(nèi)嵌緩存缺失同時(shí)生成內(nèi)嵌緩存代碼,通常遇到的情況是匹配,則簡(jiǎn)單地返回屬性x的值。

當(dāng)有許多對(duì)象具有相同的隱藏類時(shí),則就像大多數(shù)靜態(tài)語(yǔ)言一樣這些對(duì)象都受益。使用隱藏類訪問(wèn)屬性和內(nèi)嵌緩存與機(jī)器碼生成優(yōu)化組合在一起,對(duì)于相同類型的對(duì)象以相似的方式頻繁創(chuàng)建和訪問(wèn),這將大大地提高執(zhí)行大多數(shù)JavaScript代碼的速度。

高效的垃圾回收

V8回收那些在過(guò)程中不再需要的對(duì)象的內(nèi)存,這一個(gè)過(guò)程稱為垃圾回收。為了確??焖俚膶?duì)象分配,垃圾回收時(shí)間足夠短暫,沒(méi)有內(nèi)存碎片,V8使用了stop-the-world,分代,精確垃圾回收器。這意味著V8:

  1. 在執(zhí)行垃圾回收期間停止程序的執(zhí)行。
  2. 大多數(shù)的垃圾回收都是在處理一部分對(duì)象的堆。則最小化對(duì)于停止應(yīng)用執(zhí)行的影響。
  3. 總是精確知道何處的所有對(duì)象和指針在內(nèi)存中。避免了錯(cuò)誤的指示對(duì)象的指針可能帶來(lái)的內(nèi)存泄漏。

在V8中,對(duì)象的堆分成兩段:剛創(chuàng)建對(duì)象的新空間和在垃圾回收時(shí)仍在使用的老對(duì)象。如果一個(gè)對(duì)像被垃圾回收器回收,V8更新所有指向這個(gè)對(duì)象的指針。

責(zé)任編輯:yangsai 來(lái)源: csdn博客
相關(guān)推薦

2010-07-20 15:28:09

ChakraIE9瀏覽器

2010-07-20 16:18:16

2010-07-21 16:37:12

Nitro瀏覽器Webkit

2010-07-21 15:21:08

Presto瀏覽器Opera

2010-07-20 15:41:39

TridentIE瀏覽器

2010-07-21 15:43:43

Carakan瀏覽器Opera

2010-07-21 16:00:40

Vega瀏覽器Opera

2010-07-21 15:06:33

2010-07-20 16:24:38

Gecko瀏覽器

2010-07-21 16:54:29

云加速瀏覽器

2010-07-21 16:07:02

Opera Turbo瀏覽器

2010-07-20 16:01:44

GPU硬件加速瀏覽器

2010-07-21 14:47:22

2021-09-22 08:57:46

谷歌 Chrome 94瀏覽器

2020-10-30 10:15:21

Chrome V8JavaScript前端

2022-06-02 12:02:12

V8C++JavaScript

2016-04-18 09:33:52

nodejswebapp

2021-07-27 05:53:00

Chrome瀏覽器KPI

2012-03-20 11:07:08

2012-03-20 11:31:58

移動(dòng)瀏覽器
點(diǎn)贊
收藏

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