Dart 中的快照概念是啥?
Posted
技术标签:
【中文标题】Dart 中的快照概念是啥?【英文标题】:What is the snapshot concept in dart?Dart 中的快照概念是什么? 【发布时间】:2012-10-04 00:02:15 【问题描述】:我了解到,使用 dart,由于快照,您的应用程序启动速度可以提高 10 倍。谁能解释它到底是什么以及它是如何工作的?我会在什么样的应用程序中使用快照?
【问题讨论】:
【参考方案1】:Dart 的快照类似于Smalltalk images,因为它们允许几乎即时的应用程序启动。但是,与 Smalltalk 图像不同,快照不存储程序状态。
这在速度较慢的移动设备中特别有用,因为它们本身速度较慢,并且比桌面系统更受内存限制。出于这个原因,再加上电池使用会迫使我们关闭不必要的程序这一事实使得启动速度变得很重要。
Dart 使用堆快照功能解决了这个启动缓慢的问题,这与 Smalltalk 的图像系统类似。遍历应用程序的堆并将所有对象写入一个简单文件。注意:目前,Dart 发行版附带了一个启动 Dart VM、加载应用程序代码的工具,并且在调用 main 之前,它会拍摄堆的快照。 Dart VM 可以使用这样的快照文件来快速加载应用程序。
快照功能还用于序列化在 Dart Isolate 之间发送的对象图(使用 SnapshotWriter 序列化)。
目前我不知道任何方式来启动快照或处理它们。将来,我希望可以从 Web 服务器提供快照文件,并由浏览器 Dart VM 即时处理。
快照格式本身是跨平台的,这意味着它可以在 32 位、64 位机器等之间工作。该格式已被制作成可以快速读入内存,重点是最大限度地减少指针修复等额外工作。
这里是 snapshot.cc 的源代码:http://code.google.com/p/dart/source/browse/trunk/dart/runtime/vm/snapshot.cc
和测试:http://code.google.com/p/dart/source/browse/trunk/dart/runtime/vm/snapshot_test.cc
所以它之所以能够将应用程序启动速度提高 10 倍,是因为它不是像 javascript 这样按原样发送并在之后缓慢处理的源代码。 p>
您想在哪里使用它?任何可能的地方。在服务器端,它基本上已经发生在你身上(实际上并不重要)。但在客户端,这还是不可能的。据我了解,可以将这些快照提供给浏览器以供即时启动,但您确实需要等待,因为它现在不可用。
【讨论】:
应该注意,当使用快照加载 dart2js 时,我们已经看到了 10 倍的启动改进。 @SethLadd 你能详细说明你的意思吗?或者也许编辑我的答案——毕竟这是一个 wiki :) 初始测试表明,从快照启动 dart2js 比从源代码启动 dart2js 快 10 倍。现在还为时过早,但数据看起来很有希望。 另外,我认为快照不像 smalltalk 图像。 Dart 快照只是令牌流的二进制序列化,是通过解析代码生成的。快照不是“正在运行的程序的快照”,它是在令牌转换为机器代码之前生成的。因此,快照中不会捕获任何程序状态。免责声明,我不是 smalltalk 图片专家。 是的,那里绝对没有进行状态保存。模型看起来很相似,仅此而已。很高兴听到您早期的性能测试!以上是关于Dart 中的快照概念是啥?的主要内容,如果未能解决你的问题,请参考以下文章