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