问题 飞镖中的快照概念是什么?


我已经读过,使用dart,你的应用程序因快照而可以启动速度提高10倍。任何人都可以解释它到底是什么以及它是如何工作的?在什么样的应用程序中我会使用快照?


7612
2017-10-13 08:43


起源



答案:


Dart的快照就像 Smalltalk图像 从某种意义上说,它们允许几乎即时的应用启动。但是,与Smalltalk图像不同,快照不存储程序状态。

这在速度较慢的移动设备中尤其有用,因为它们本身速度较慢,并且受内存的限制远远超过桌面系统。这个原因和电池使用需要我们关闭不必要的程序的事实使启动速度变得重要。

Dart通过堆快照功能解决了这个慢启动问题,这与Smalltalk的图像系统类似。遍历应用程序的堆,并将所有对象写入简单文件。注意:目前,Dart发行版附带了一个工具,可以启动Dart VM,加载应用程序的代码,在调用main之前,它会获取堆的快照。 Dart VM可以使用此类快照文件快速加载应用程序。

快照功能还用于序列化在Dart Isolates(使用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,按原样发送,然后慢慢处理。

你想在哪里使用它?你可能在哪里。在服务器端,它基本上已经发生在您身上(并不重要)。但在客户端,这是不可能的 然而。据我了解,可以将这些快照提供给浏览器以便即时启动,但是你必须等待,因为它现在还没有。


10
2017-10-13 21:54



应该注意,当使用快照加载dart2js时,我们看到启动改进了10倍。 - Seth Ladd
@SethLadd你能详细说明你的意思吗?或者也许编辑我的答案 - 毕竟这是一个维基:) - Kai Sellgren
初步测试表明,从快照启动dart2js比从源代码启动dart2js快10倍。现在还为时尚早,但数据看起来很有希望。 - Seth Ladd
此外,我不认为快照就像smalltalk图像。 Dart快照只是令牌流的二进制序列化,通过解析代码生成。快照不是“正在运行的程序的快照”,它是在将令牌转换为机器代码之前生成的。因此,快照中不会捕获任何程序状态。免责声明,我不是一个smalltalk图像专家。 - Seth Ladd
是的,肯定没有国家储蓄。该模型看起来很相似,就是这样。很高兴听到您的早期性能测试! - Kai Sellgren


答案:


Dart的快照就像 Smalltalk图像 从某种意义上说,它们允许几乎即时的应用启动。但是,与Smalltalk图像不同,快照不存储程序状态。

这在速度较慢的移动设备中尤其有用,因为它们本身速度较慢,并且受内存的限制远远超过桌面系统。这个原因和电池使用需要我们关闭不必要的程序的事实使启动速度变得重要。

Dart通过堆快照功能解决了这个慢启动问题,这与Smalltalk的图像系统类似。遍历应用程序的堆,并将所有对象写入简单文件。注意:目前,Dart发行版附带了一个工具,可以启动Dart VM,加载应用程序的代码,在调用main之前,它会获取堆的快照。 Dart VM可以使用此类快照文件快速加载应用程序。

快照功能还用于序列化在Dart Isolates(使用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,按原样发送,然后慢慢处理。

你想在哪里使用它?你可能在哪里。在服务器端,它基本上已经发生在您身上(并不重要)。但在客户端,这是不可能的 然而。据我了解,可以将这些快照提供给浏览器以便即时启动,但是你必须等待,因为它现在还没有。


10
2017-10-13 21:54



应该注意,当使用快照加载dart2js时,我们看到启动改进了10倍。 - Seth Ladd
@SethLadd你能详细说明你的意思吗?或者也许编辑我的答案 - 毕竟这是一个维基:) - Kai Sellgren
初步测试表明,从快照启动dart2js比从源代码启动dart2js快10倍。现在还为时尚早,但数据看起来很有希望。 - Seth Ladd
此外,我不认为快照就像smalltalk图像。 Dart快照只是令牌流的二进制序列化,通过解析代码生成。快照不是“正在运行的程序的快照”,它是在将令牌转换为机器代码之前生成的。因此,快照中不会捕获任何程序状态。免责声明,我不是一个smalltalk图像专家。 - Seth Ladd
是的,肯定没有国家储蓄。该模型看起来很相似,就是这样。很高兴听到您的早期性能测试! - Kai Sellgren