|
本帖最后由 hanguokai 于 2013-4-2 23:02 编辑
原文:http://han.guokai.blog.163.com/b ... 271201312015233579/
snapshot 及其主要用途
snapshot 是 Dart 程序的二进制序列化形式,和对象在 isolate 中的内存形式接近。
snapshot 的主要目的是提高 dart 程序的启动速度。
和读取源代码相比,snapshot 无需解析源代码,而是直接还原到程序开始执行前的初始状态。
dart 核心库、dart2js 等都会使用 snapshot 提高程序的启动速度。
snapshot 比从源代码加载要快得多,比正常的 JavaScript 启动速度快 10 倍。
而 JavaScript 很难做到这点,因为 JavaScript 的源码会有副作用,不能被实现为 snapshot 。
不管是桌面 Web、移动 Web 还是 server 端程序,快速的启动都是很有用的。
snapshot 特别适合较大型的 Web App ,比如 Gmail 在启动的时候需要预先读取 1MB 的 JavaScript 源代码,但如果是读取缓存在浏览器中的 Dart snapshot ,那么启动时间只需读取源代码时间的 1/10 。
当前 Dart 团队正在尝试减小 snapshot 的大小,因为这会直接影响到启动速度。
snapshot 除了提高启动速度外,还用于 isolate 之间的对象传递。
snapshot 的两种执行环境:
对于 Web App,什么都不用做,浏览器会自动使用 snapshot。因为支持 Dart VM 的浏览器会自动创建应用的 snapshot ,下次执行的时候浏览器就会从缓存中使用应用的 snapshot 执行。
对于命令行程序,你可以自己创建应用的 snapshot 用于启动,就像 dart2js 那样。
snapshot 的几种形式:
完全快照(full snapshot):表示初始化之后 isolate 堆内存的完全表示。用于加快 dart 核心库及其它 dart 内置库的启动和初始化速度。
脚本快照(script snapshot):表示应用加载之后执行之前 isolate 堆内存中的应用脚本。用于加快应用的启动和初始化速度。
对象快照(object snapshot):表示 Dart VM 中 isolate 之间传递的消息对象。
基本用法:
生成 snapshot 使用 --generate-script-snapshot 选项,如:
dart --generate-script-snapshot=foo.snapshot foo.dart
另外,可以使用 --package_root 选项指定用到的包的位置:
dart [--package_root=path] --generate-script-snapshot=out-file dart-script-file
使用 snapshot:
dart --use-script-snapshot=snapshot-file dart-file args
参数就是需要传递给应用本身的参数。
参考资料:http://www.dartlang.org/articles/snapshots/ |
|