自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

瀏覽器辭典:V8

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

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

Chrome V8設(shè)計

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

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

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

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

◆快速屬性訪問

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

◆高效的垃圾回收

快速屬性訪問

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

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

為了更加清除說明這一個點,想象如下一個的簡單的JavaScript函數(shù):

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

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

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

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

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

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

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

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

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

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

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

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

例如,JavaScript代碼訪問Point對象的屬性x:

point.x

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

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

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

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

高效的垃圾回收

V8回收那些在過程中不再需要的對象的內(nèi)存,這一個過程稱為垃圾回收。為了確??焖俚膶ο蠓峙洌厥諘r間足夠短暫,沒有內(nèi)存碎片,V8使用了stop-the-world,分代,精確垃圾回收器。這意味著V8:

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

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

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

2010-07-20 15:28:09

ChakraIE9瀏覽器

2010-07-20 16:18:16

2010-07-21 15:21:08

Presto瀏覽器Opera

2010-07-21 16:37:12

Nitro瀏覽器Webkit

2010-07-20 16:24:38

Gecko瀏覽器

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-21 16:07:02

Opera Turbo瀏覽器

2010-07-21 16:54:29

云加速瀏覽器

2010-07-21 14:47:22

2010-07-20 16:01:44

GPU硬件加速瀏覽器

2020-10-30 10:15:21

Chrome V8JavaScript前端

2021-09-22 08:57:46

谷歌 Chrome 94瀏覽器

2022-06-02 12:02:12

V8C++JavaScript

2016-04-18 09:33:52

nodejswebapp

2021-07-27 05:53:00

Chrome瀏覽器KPI

2023-10-10 10:23:50

JavaScriptV8

2014-11-26 09:51:24

GithubGoogleV8
點贊
收藏

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