Dart特性
Dart同時支援JIT(Just In Time,即時編譯)和AOT(Ahead of Time,執行前編譯)兩種編譯模式。
JIT 在執行時即時編譯,在開發週期中使用,可以動態下發和執行程式碼,開發測試效率高,但執行速度和執行效能則會因為執行時即時編譯受到影響。
AOT 即提前編譯,可以生成被直接執行的二進位制程式碼,執行速度快、執行效能表現好,但每次執行前都需要提前編譯,開發測試效率低。
Flutter在開發期使用JIT編譯,可以縮短產品的開發週期,例如熱過載就是基於該特性。在釋出期使用AOT,具有執行速度快、執行效能好的特點。
記憶體分配與垃圾回收
Dart VM的記憶體分配策略為,建立物件時只需要在堆上移動指標,記憶體增長始終是線性的,省去了查詢可用記憶體的過程。
在Dart中,併發是通過Isolate實現的。Isolate是類似於執行緒但不共享記憶體,獨立執行的worker。這樣的機制,就可以讓Dart實現無鎖的快速分配。
Dart的垃圾回收採用多生代演算法。新生代在回收記憶體時採用“半空間”機制,出發垃圾回收時,Dart會將當前半空間中的“活躍”物件拷貝到備用控制元件,然後整體釋放當前空間的所有記憶體。回收過程中,Dart只需要操作少量的“活躍”物件,沒有引用的大量“死亡”物件則被忽略,這樣的回收機制很適合Flutter框架中大量Widget銷燬重建的場景。
單執行緒
Dart是單執行緒模型,不存在資源競爭和狀態同步的問題。這就意味著,一旦某個函式開始執行,就將執行到這個函式結束,而不會被其他Dart程式碼打斷。
Dart中並沒有執行緒,只有Isolate(隔離區)。Isolates之前不會共享記憶體,就像幾個執行在不同程式中的worker,通過事件迴圈(Event Looper)在事件佇列(Event Queue)上傳遞訊息通訊。
無需單獨的宣告式佈局語言
- 在Flutter中,介面佈局直接通過Dart編碼來定義。
- Dart宣告式程式設計佈局易於閱讀和視覺化,使得Flutter並不需要類似JSX或XML的宣告式佈局語言。所有的佈局都使用同一種格式,也使得Flutter很容易提供高階工具使佈局更簡單。
- 開發過程也不需要視覺化介面構建器,因為熱過載可以讓我們立即在手機上看到效果。