Dart特性
1、JIT 与 AOT
语言在运行之前通常都需要编译、JIT和AOT是最常见的两种编译模式
JIT在运行时即时编译,在开发周期中使用,可以动态下发和执行代码。开发测试效率高。但运行速度和执行性能则会因为运行时即时编译受到影响。
AOT即提前编译、可以生成被直接执行的二进制代码,运行速度快,执行性能表现好。但每次执行都需要提前编译,开发测试效率低。
在开发期使用JIT编译、可以缩短产品的开发周期,热重载基于此特性,在发布期使用AOT、就不需要跨平台建立低效方法调用映射关系。Dart具有运行速度快,
执行性能好的特点
需要编译的语言通常属于AOT、不需要编译的属于JIT
AOT典型代表是C/C++、必须在执行前编译成机器码。JIT的代表是JavaScript、Python等几乎所有的脚本语言、
内存分配与垃圾回收
内存分配策略比较简单、创建对象只需要在堆上移动指针。内存增长始终是线性的,省去了查找可用内存的过程。
在Dart中,并发是通过lsolate实现的,lsolate是类似于线程但不共享内存。独立运行的worker。这样的机制。就可以让Dart实现无锁的快速分配
Dart垃圾回收、采用了多生代算法。新生代在回收内存时采用"半空间"机制,触发垃圾回收时,Dart会将当前半空间的"活跃"对象拷贝到备用空间、
然后整体释放当前空间的所有内存。回收过程中,Dart只需要操作少量的活跃对象。没有引用大量的"死亡"对象则被忽略。这样的回收机制很适合Flutter
框架中大量Widget销毁重建的场景。
单线程模型
支持并发执行线程的高级语言、比如(C++、Java、Objective-C)。大都以抢占方式切换线程,即每个线程都会被分配一个固定的时间片来执行。超过了
时间片后线程上下文将被抢占后切换。如果这时正在更新线程间的共享资源。抢占后就可能导致数据不同步的问题。
解决方法是使用锁来保护、锁本身会带来性能损耗,甚至出现死锁的严重问题。
Dart单线程、一旦某个函数开始执行、就将执行到这个函数结束,而不会被其他Dart代码打断。
Dart中并没有线程、只有lsolate(隔离区)。lsolate之间不共享内存、就像几个运行在不用进程中的worker、通过事件循环(Event Looper)在事件队列
(Event Queue)上传递消息通信、
无需单独的声明式布局语言
在Flutter中,界面布局直接通过Dart编码来定义、Dart声明式编程布局易于阅读和可视化,使得Flutter并不需要类似JSX或XML的声明式布局语言。所有的布局
都是同一种格式,开发过程中不需要可视化界面构建器。因为热重载可以让我们立即在手机上看到运行结果。