本文翻譯自 inVerita 的《Flutter vs React Native vs Native: Deep Performance Comparison》react
原文連接: medium.com/swlh/flutte…)git
inVerita(inveritasoft.com/)一直致力於移動跨平臺方案的性能問題,以此來解答哪一種場景下開發者須要使用 Flutter 、 React Native 或原生開發,甚至是你須要選擇哪一個職業。github
在以前的 《Flutter vs Native vs React-Native: Examining performance》 對比中有一個很有爭議的點,其中有人提出正常狀況下咱們是不會在 React Native 進行這些重複和複雜的計算,雖然在這種狀況下,使用 Flutter 或 Native 確實會有更好的表現結果。react-native
因此這一次咱們決定研究 UI 的性能對比,由於它對移動應用開發的平常影響更大一些。緩存
在移動平臺想要衡量 UI 性能很複雜,由於這須要開發者在每一個平臺上,都以相同的方式去實現同樣的功能,而本文將使用 GameBench(www.gamebench.net/) 做爲測試工具以確保測試的客觀性。框架
GameBench 自己還有不少改進的空間,但咱們的目標是設法將每一個測試程序都放置在一個測試環境中。ide
本書的測試代碼是開源的,因此若是你有什麼想法也歡迎和咱們分享。UI 動畫一般在不一樣平臺上須要使用不一樣的工具,所以咱們會將全部的測試內容都縮小到每一個平臺支持的庫中,這樣至少能儘可能作到公平一些。工具
固然不一樣的運行方法可能會出現不同的測試結果,咱們相信在某個領域真正的技術專家可讓對應邏輯極限運行以超過咱們的結果。本文的測試環境:性能
這裏咱們使用原生、React Native 和 Flutter 在 Android 與 iOS 上實現了相同的 UI 列表,而且:測試
RecyclerView.SmoothScroller
來自動化滾動速度;ScrollController
實現列表的平滑滾動;在每種狀況下列表視圖中都有 1000 個項目,而且以相同時間滾動到最後一個列表元素,同時在每一個平臺都使用對應的庫進行圖像緩存,更多細節能夠在源代碼中查看,其中圖片使用的第三方庫:
Nuke
Glide
React-native-fast-image
Android — GPU 測試結果不支持 benchmark
檢測結果:
JSBridge
,這會在序列化和反序列化方面浪費資源。檢測結果:
一、在 FPS 上 React Native 的結果比 Flutter 和 Swift 差,緣由是沒法在 iOS 上使用 IoT 編譯。 二、在內存上 Flutter 與原生的內存消耗幾乎相同,但在 Flutter 在 CPU 上消耗更重,在此測試中結果中 React Native 遠遠落後於 Flutter 和原生。 三、在測試結果中 Flutter 會利用更多CPU,而 iOS 原生會更多利用 GPU;
現在大多數 Android 和 iOS 都具備強大的硬件,因此在大多數狀況下是不會發現 fps 有明顯的降低,這就是爲何咱們決定增長複雜的動畫測試的緣由,而且要足夠複雜以實現致使 fps 降低。
該測試用力在 Android,iOS,React Native 上使用了 Lottie 進行復雜矢量動畫的展現,並在 Flutter 上使用了 Flare 實現相同的動畫。
以下圖所示,是在 Android 、iOS 和 React Native 上使用 Lottie ,而在 Flutter 上使用的Flare 的實現效果。
而從上述網格動畫中刪除一個特定的動畫後,竟然會使 Flutter 上的 FPS 最高提升 40%,因此這裏猜想多是 Flare 對於相似乎任務沒有進行優化,或者 Flutter 自己對這種繪製存在兼容問題的緣由:
請注意:在這種狀況下咱們爲 Flutter 使用了一個不一樣的庫,該庫比咱們在其餘平臺上使用的庫重得多,這多是fps降低的緣由。(由於 Lottie 在 Flutter 上目前的開源效果更差)
在此測試中,咱們對 200 張圖像進行動畫運行(旋轉和淡入淡出),從而對比不一樣平臺的性能。
對於平常應用上須要使用的動畫和炫酷UI,不管哪一種技術都不會有太大障礙,可是若是要一些繁重的動畫的狀況下,原生才能得到最好的性能,接下來纔是 Flutter 和 React Native。
另外這裏不建議在須要 CPU 繁重的操做中使用 React Native,而 Flutter 從 CPU 和內存的角度來可能會比較適合此類任務。
固然選擇什麼框架工具取決於不一樣的業務場景,若是是須要開發單平臺MVP(最小可行性產品),那最好使用原生Native開發,而 Flutter 的優點仍是在於能夠爲移動、Web、PC等構建相同的 UI 邏輯,尤爲是在初期開發預算畢竟緊張,而後還須要性能不錯的狀況下,固然這還和你的自己的技術棧有關係。
另外在 1.17 版本開始,底層繪製上 Android 可能會用到 Vulkan,而 iOS 可能會是 Metal,這主要和硬件還有系統版本有關係,好比在支持 Metal 的 iOS 上 Flutter 的性能繪製能夠提升 50% 。