C++
語言同樣的編譯器,可是,同C++
編譯器生成的本地代碼結果不一樣,通過編譯器編譯以後的是字節碼,字節碼是平臺無關的;Java
的運行環境也就是Java
虛擬機會加載字節碼,使用解釋執行這些字節碼;Java
虛擬機通常都引入了JIT
技術,也就是前面說的將字節碼轉變成本地代碼來提升執行效率;Java
虛擬機和C++
編譯器中衆多的技術;Java
虛擬機的JIT
技術引入,如今的作法是將抽象語法樹轉成中間表示(也就是字節碼),而後經過JIT
技術轉成本地代碼,這可以大大的提升了執行效率;JIT
技術,例如V8;JavaScript
跟Java
仍是有如下一些區別:JavaScript
是無類型的語言,這使得對於對象的表示和屬性的訪問上比Java
存在比較大的性能損失;Java
語言一般是將源代碼編譯成字節碼,這個同執行階段是分開的,也就是從源代碼到抽象語法樹到字節碼這段時間的長短是無所謂的,主要是儘量的生成高效的字節碼便可;而對於JavaScript
,這些都是在網頁和JavaScript
文件下載後同執行階段一塊兒在網頁的加載和渲染過程當中來實施的,因此對它們的處理時間也有着很高的要求;JIT
工具:一個可以可以JIT
的工具,將字節碼或者抽象語法樹轉換成本地代碼;在WebKit
項目中,最初只有JavaScriptCore
引擎;在Blink還獨立出來以前,爲了支持不一樣的JavaScript
引擎,WebKit
設計了一套接口能夠切換使用不一樣的JavaScript
引擎(事實上,這一接口會下降性能),因此,WebKit
當時能夠支持兩種類型的JavaScript
引擎,那就是JavaScriptCore
引擎和V8
引擎;二者都是基於WebKit
所提供的接口來同渲染引擎協同工做;javascript
JavaScriptCore
引擎是WebKit
中默認的引擎;JavaScriptCore
引擎開始一個新的優化工做;JavaScriptCore
最簡單的處理部分,主要是將源代碼翻譯成抽象語法樹,以後是平臺無關的字節碼,在最初的版本中,字節碼會被JavaScriptCore
引擎解釋執行;在後面的版本中,逐漸加入了JIT
編譯器,將熱點函數生成本地代碼;java
JavaScript
代碼執行效率從而得到更好的網頁瀏覽效果,它甚至採用直接將JavaScript
編譯成本地代碼的方式;JavaScriptCore
引擎同樣,以後兩個引擎開始不一樣;JavaScriptCore
引擎,V8
引擎並不將抽象語法樹轉變成字節碼或者其它中間表示,而是經過JIT
編譯器的全代碼生成器從抽象語法樹直接生成本地代碼,因此沒有像Java
同樣的虛擬機或者字節碼解釋器;JavaScript
使用場景其實使用解釋器更爲合適,由於沒有必要生成本地代碼;V8工
程師們引入了Crankshaft
編譯器,它可以對熱點的JS
函數進行生成的分析和優化後再生成本地代碼,緣由在於不是全部的JavaScript
代碼都合適作如此深層次的優化,由於優化自己也須要花費必定的時間;WebSockets
;Chromium
使用了預DNS
解析和資源預取等技術,極大的減小了用戶等待時間;Chromium
又引入了SPDY
和QUIC
等新網絡協議,用於減小網絡傳輸時間;HTTP
協議爲例,在創建TCP
的socket
鏈接過程當中涉及的類;URLRequest
被上層調用啓動請求的時候,它會根據URL
的scheme
來決定須要建立什麼類型的請求,例如http://
,file://
;還能夠是自定義的scheme
,例如Android
系統的file://assets/
;URLRequest
建立的是一個URLRequestJob
子類的一個對象,爲了支持自定義的scheme
處理方式,它是利用工廠模式;基本的思路是,用戶能夠在該類中註冊多個工廠,當有URLRequest
請求時候,先有工廠檢查它是否須要處理該scheme
,若是沒有,繼續交由下一個工廠類;最後,若是沒有任何工廠可以處理的話,則交給內置的工廠來檢查和處理是不是http://
,ftp://
或者file://
等;URLRequestHttpJob
被建立後,它首先從Cookie
管理器中獲取跟該URL
相關聯的信息;以後,一樣藉助於HttpTransactionFactory
建立一個HttpTransaction
類的對象來表示開啓一個HTTP
鏈接的事務(不一樣於數據庫中的事務概念;HttpCache
類使用本地磁盤緩存機制,若是該請求對應的回覆已經在磁盤緩存中,那麼無需再創建HttpTransaction
來發起鏈接,直接從磁盤中獲取;URL
請求對應的HttpTransaction
已經創建,那麼只要等待它的回覆便可;HttpTransaction
;HttpNetworkTransaction
使用HttpNetworkSession
來管理鏈接會話;
HttpNetworkSession
經過它的成員HttpStreamFactory
來創建TCP Socket
鏈接;HttpStream
對象;HttpStreamFactory
將和網絡之間的數據讀寫交給本身新建立的一個HttpStream
對象來處理;Chromium中
的跟服務器創建鏈接的套接字是StreamSocket
,它是一個抽象類;同時,爲了支持SSL
機制,它還有一個子類就是SSLSocket
;HTTP
管線化技術的網絡延遲和安全性問題;SPDY
協議的服務器和客戶端能夠將網絡加載的時間減小64%;在HTTP2.0
的草案中引入SPDY
協議做爲基礎來編寫;SPDY
協議是一種新的會話層協議,它定義在HTTP
協議和TCP
協議之間;協議的核心思想是多路複用,僅使用一個鏈接來傳輸一個網頁中的衆多資源;
* 它本上並無改變HTTP
協議,只是將HTTP
協議頭經過SPDY
來封裝和傳輸;
* 其傳輸方式也沒有發生變化,而後使用TCP/IP
協議;
* 因此,它相對比較容易的佈置,服務器只須要插入SPDY
協議的解釋層,從SPDY
的消息頭中獲取各個資源的HTTP
頭便可;
* SPDY
協議必須創建在SSL
層之上,這是一個比較大的限制,由於有不少網站不必定但願支持HTTPS
;python
SPDY
的工做方式有如下四個特徵:
* 利用一個TCP
鏈接來傳輸不限個數的資源請求的讀寫流,這與以前的爲每一個資源請求都創建一個TCP
鏈接大大不一樣,這明顯提升了TCP
鏈接的利用率,減小TCP
鏈接的維護成本;
* 根據資源請求的特性和優先級,SPDY
能夠調整它們的請求這些資源的優先級,例如對JavaScript
資源的優先級很高,服務器優先傳輸回覆該類型的請求;
* 對這些請求使用壓縮技術,大大減小須要傳送的字節數;這一思想已普遍應用於各類瀏覽器中;
* 當用戶須要瀏覽某個網頁的時候,支持SPDY
協議的服務器在發送網頁內容時候能夠嘗試發送一些信息給瀏覽器,告訴後面可能須要哪些資源,瀏覽器能夠提早知道並決定是否須要下載;更極端的狀況是,服務器能夠主動發送資源;web