来源[宣布Dart 2.2:更快的本机代码,支持设置文字]今天(2019年2月26日),我们宣布Dart 2.2 SDK的发布-Dart 2的更新,它提供了改进的
提前(AOT)代码性能并支持Set文字。

改进Dart性能以进行Flutter开发
我们将继续努力,以使
AOT编译的代码 (例如Flutter应用程序)更快。 在Dart 2.1中,
我们降低了类型检查
的成本 ,大大降低了AOT编译的代码和在JIT(即时)编译的虚拟机上运行的代码的类型检查的成本。
在Dart 2.2中,我们专注于AOT编译的代码的性能
,在微基准测试上将性能提高
了11-16% (通过将代码的大小增加约1%)。 这项改进是经过数个季度的努力的结果,目的是降低静态呼叫的成本。 我们优化的AOT代码现在可以使用PC调用(即使用“
程序计数器” )直接调用所请求的对象。 在此之前,我们必须在对象库中进行几次搜索以确定所需的地址。 当代码包含许多构造函数和静态方法调用(例如包含许多小部件的Flutter用户界面代码)时,这些优化特别有用。
在Dart 2.2中支持Set文字
Dart主库(dart:核心)包含几个集合类:
Maps ,
Lists和
Sets 。 映射是一组键值对。 列表是值的有序序列,每个序列都可以使用索引进行访问,并且可以多次出现。 集合是值的无序集合,其中每个值只能出现一次,并且可以在其中进行有效检查以查看集合中是否存在一个值。
Dart集合通常使用编译时常量进行初始化,并且Dart提供了用于编写此初始化的便捷语法。 在Dart列表中,您可以按以下方式进行初始化:
const List<String> releases = ['Dart 2.0', 'Dart 2.1', 'Dart 2.2'];
以前,Dart仅支持List和Map的文字语法,因此Set的初始化很麻烦,因为我们必须通过列表进行初始化:
Set<String> currencies = Set.of(['EUR', 'USD', 'JPY']);
这段代码不仅不方便而且效率低下。 缺乏文字支持会阻止在编译时创建不可变的Set。 在Dart 2.2中增加了Set文字支持后,使用方便的新语法初始化set并使它不可变:
const Set<String> currencies = {'EUR', 'USD', 'JPY'};
在
此处可以找到使用Flutter命令使用Set常量的真实示例。 为了更深入地了解此问题,建议您熟悉
更新的Dart 2.2语言导览 。
利用Dart 2通用前端(CFE)进行创新
Dart提供了自己的几种实现:Flutter使用的Dart VM,dart2js编译器和Dart dev编译器(dartdevc),所有这些都使用Common Front-End编译器。 Dart通用前端(CFE)解析Dart代码,执行类型推断,并将Dart转换为较低级别的中间语言,后端编译器将其作为输入接受。
集合文字是CFE能够快速实现的一种语言构造示例。 一旦对所有实现都使用CFE,就实现了解析Set文字和执行类型推断的代码。 此外,我们创建了一个过渡实现,供后端编译器在初始阶段使用。 在一个中间实现中,指定的文字集的可变版本在编译期间被转换为等效形式:
Set<String> currencies = Set<String>()..add('EUR')..add('USD')..add('JPY');
常量Set文字的中间实现方式的不同之处在于,它们不能逐步组装成部分。 相反,我们通过包装一个不可变Map的私有不可变Set类来实现此目标,其中Set元素是Map键:
const Set<String> currencies = _UnmodifiableSet<String>({'EUR': null, 'USD': null, 'JPY': null});
不可变的Set类在Set接口中实现方法,将方法委派给内部Map。
通常,我们最初可以将Set文字实现为CFE的唯一功能。 后端可以立即使用CFE实现,并在以后实现自己的支持。 这使后端编译器可以将其支持推迟到更好地理解此功能的性能方面。
Dart 2.2规格
Dart 2是对Dart的重大更新,以至于我们花了一些时间来更新
官方语言规范以适应我们所做的所有更改。 我们终于完成了这项工作,并且规范已更新为Dart 2.2版。 我们还将语言规范移至
新的存储库,并添加了持续集成功能,以确保随着Dart语言的未来版本的发展,该规范以PDF格式不断更新。
Dart规范页面上同时提供
了 2.2和以后的Dart 2.x规范。
如何安装Dart 2.2
Dart SDK 2.2从今天开始在Dart主页上可用。 如果您是Flutter开发人员,那么Dart 2.2已经包含在内。 (注意:在flutter doctor控制台命令上,当前的Flutter主通道和开发人员通道将报告Dart 2.2。
今天的Flutter 1.2稳定版本将输出Dart 2.1.2;此版本具有与Dart 2.2相同的功能)。
现在就这些了。 我们希望您喜欢Dart 2.2!
非常感谢您对翻译
PsyHaSTe的帮助