Flutter vs React Native vs Native:深度性能比較

2020年07月12日16:52:04 科技 1500

作者 | InVerita

譯者 | Sambodhi

策劃 | 蔡芳芳

Flutter 是 Google 開源的移動用戶界面框架,可以快速在 iOS 和 Android 上構建高質量的原生用戶界面,正在被全球越來越多的開發者和組織使用。而 React Native(簡稱 RN)是 Facebook 開源的跨平台移動應用開發框架,是 Facebook 早先開源的 JS 框架 React 在原生移動應用平台的衍生產物,支持 iOS 和安卓兩大平台。至於 Native,就是傳統的原生 App 開發模式。那麼問題來了,在這三種開發技術,我們該如何進行選型呢?本文將對這三種開發方案的性能進行深度對比,包括它們在多個應用場景下 FPS、CPU、內存和 GPU 方面的性能。希望對讀者有所幫助。

本文最初發表在 Medium 博客,經原作者 inVerta 公司授權,由 InfoQ 中文站翻譯並分享。

研究背景

inVerita 及其移動開發團隊不斷深入研究市場上可用的跨平台移動解決方案的性能,以回答這樣一個問題:對於你的產品,甚至是你的職業生涯來說,Flutter、React Native(或 Native),哪種技術是最好的?這就是文章 《Flutter vs React Native vs Native:性能考察》 的由來。是的,這篇文章引發了一些爭議,因為有人認為,我們並沒有使用 React Native 每天進行很多次計算,但如果是這種情況,CPU 佔用率較高的任務由 Flutter 或 Native app 來完成會更好。

這也是為什麼在本文中,我們決定研究用戶界面的性能,因為它對移動應用程序的普通用戶影響更大。

衡量用戶界面性能很複雜,它需要工程師在每個平台上以相同的方式實現相同的功能。我們選擇了 GameBench 作為全局測試工具,以確保我們能夠保持客觀(這並不會改變我們在很多方面喜愛 Flutter 這一事實,並且我們也運行着大量 React Native 和 Native 項目)。儘管 GameBench 還有很大的改進空間,但是,在它的幫助下,我們還是成功地將每個應用程序放入一個單獨的測試環境中,這也是我們的目標。

源代碼是開源的,因此,如果你願意的話,可以自己做實驗並與我們分享你的想法。用戶界面的動畫通常在不同的平台上使用不同的工具,所以我們將範圍限制在每個平台(只有一種情況除外)都支持的庫中,或者至少我們已經盡己所能來實現這一點。現在,讓我們來看看這些用例。

硬件信息:為完成這項測試,我們使用了價格實惠的手機:紅米 Note5 和 iPhone 6S。

GitHub 鏈接

https://github.com/InVeritaSoft/Mobile_frameworks_UI-benchmarks

用例 1:列表視圖基準測試

我們使用 Native、React Native 和 Flutter 在 Android 和 iOS 上實現了相同的用戶界面。我們還使用 RecyclerView 實現了滾動速度的自動化。在 Android 上我們使用 SmoothScroller;在 iOS 和 React Native 上,我們使用了一種定時器和以編程方式滾動到位置的方法;在 Flutter 上,我們使用 ScrollController 來平滑地滾動列表。在每種情況下,我們在列表視圖中都有 1000 個項目,並且都使用同樣的滾動時間才能到達最後一個列表元素。在每種情況下,我們在每個平台上使用不同庫的圖像緩存。更多的細節可參閱 源代碼。

本案例使用的第三方庫:

iOS

加載和緩存圖像:Nuke

Android

加載和緩存圖像:Glide

React Native

加載和緩存圖像:React-native-fast-image

Flutter vs React Native vs Native:深度性能比較 - 天天要聞

測試結果:

Android

GPU 測試結果不受基準測試的支持(不幸的是,這樣的設備我們還有很多)。

Flutter vs React Native vs Native:深度性能比較 - 天天要聞

所有測試都顯示 FPS 大致相同。

與 Flutter 和 React Native 相比,Android Native 使用的內存只有一半。

React Native 需要最大程度的 CPU 利用率。原因是在 JS 和 Native 代碼之間使用 JSBridge,這會導致在序列化和反序列化上資源的浪費。

在電池開發方面,Android Native 取得了最好的結果。React Native 落後於 Android 和 Flutter。在 React Native 上運行連續動畫會消耗更多的電池電量。

iOS

Flutter vs React Native vs Native:深度性能比較 - 天天要聞

FPS:React Native 的結果比 Flutter 和 Swift 更差。原因是無法在 iOS 上使用 IoT 編譯。

內存:Flutter 在內存消耗上方面基於與原生方式相當,但在 CPU 的佔用率仍然較高。在這項測試中,React Native 遠遠落後於 Flutter 和 Native。

Flutter 和 Swift 之間的區別:當 iOS Native 正在使用 GPU 時,Flutter 正在使用 CPU。Flutter 中的協調增加了 CPU 上的負載。

用例 2:重動畫測試

如今,大多數 Android 和 iOS 手機的硬件配置都很強大。在大多數情況下,使用普通應用,FPS 的下降並不會引人注意。這就是為什麼我們決定用重動畫進行一些測試。這些動畫重到足以讓 FPS 下降到引人注意的地步。我們在 Android、iOS、React Native 上使用 Lottie 製作的矢量動畫,並在 Flutter 上的 Flare 採用了同樣的動畫。

使用 Android、iOS 和 React Native 版的 Lottie 和 Flutter 的 Flare 測試動畫。

Flutter vs React Native vs Native:深度性能比較 - 天天要聞

Android 上的 Lottie

Flutter vs React Native vs Native:深度性能比較 - 天天要聞

Android 測試結果

Flutter vs React Native vs Native:深度性能比較 - 天天要聞

iOS 測試結果

Android

Android 和 React Native 在性能上表現相似,這是顯而易見的,因為 React Native 版的 Lottie 使用了原生方式(CPU 佔用率 16~19%,FPS 為 30~29)。

Flutter 的結果令人驚訝,儘管它在性能演示中有點搞砸了(CPU 佔用率為 12%,FPS 為 9)。

我們發現,從網格中刪除一個特定的動畫,會讓 Flutter 上的 FPS 最高提高 40%。我們認為 Flare 更重,並且沒有針對這類任務進行優化,這就是為什麼 Flutter 獲得如此高的 FPS 下降。

Android 需要的內存最少(205MB),React Native 需要 280MB,Flutter 需要 266MB。

應用程序冷啟動。Flutter 在這個指標上表現最好(2 秒),而 Android Native 和 React Native 大約需要 4 秒鐘。

iOS

iOS 和 React Native 在這個測試中的結果幾乎與 Lottie 的 React Native 使用原生方式相同。

Flare 和 Flutter 依然讓人驚訝,Flare 肯定還有一段路要走。

iOS Native 需要的內存最少(48MB),React Native 需要 135MB,Flutter 需要 117MB。

應用程序冷啟動。Flutter 在這個指標上表現最好(2 秒),而 iOS 和 React Native 大約需要 10 秒鐘。

請注意:在這個用例中,Flutter 用了一個不同的庫,與我們在其他平台上使用的庫相比,這個庫要重得多,這可能是導致 FPS 下降的原因。

用例 3:旋轉、縮放和淡入淡出

在這項測試中,我們比較了 200 張動圖的動畫性能,縮放、旋轉和淡入淡出同時執行。

Flutter vs React Native vs Native:深度性能比較 - 天天要聞

200 張動圖

Flutter vs React Native vs Native:深度性能比較 - 天天要聞

Android 測試結果

Android

Native 顯示了最高的性能及最高效的內存消耗。

Flutter 顯示了非常接近 Native 的 FPS,內存開銷增加了兩倍多,但仍有不錯的性能。

React Native 在這種用例中表現不佳。

Flutter vs React Native vs Native:深度性能比較 - 天天要聞

iOS 測試結果

iOS

iPhone 6S 足夠強大,在所有這 3 種用例中,FPS 都不會下降。

Native 佔用的資源較少,而 GPU 佔用率最多。

React Native 主要使用 CPU 進行渲染,而 Flutter 使用 GPU。

React Native 佔用了更多的內存。

總 結

對於一般的應用來說,小型動畫和炫酷的外觀,選擇哪種技術根本不重要。但如果要做一些重動畫的話,請記住,Native 具有最強的性能。其次就是 Flutter 和 React Native。我們絕對不推薦在 CPU 佔用率很高的操作中使用 React Native,而 Flutter 非常適合這種任務,無論是從 CPU 還是內存的角度。

選擇哪種工具要取決於具體的產品和業務案例。如果你想開發一個單一平台 MVP——使用原生方式,但請記住,Flutter 應用程序可以同時為移動、網絡和桌面環境而構建,而且我們有預感,Flutter 在不久的將來有望成為跨平台開發的王者,因為即使在今天,Flutter 也是原生開發工具一個非常不錯的競爭對手,特別是如果你的開發預算不是太緊張,但你仍然想為應用程序謀求良好性能的話。

我們面對的事實是,可能會有很多因素影響每個技術的實施和基準,而你們中的許多人,可能是某個特定平台的真正專家,可以從心愛的工具集中獲取更多的好處。我們試圖通過為每個應用創建一個單一的測試環境,以及一套單一的工具來衡量性能,從而將儘可能提高整個過程的透明度,我希望你喜歡我們這樣得到的結果。

參考閱讀:

https://medium.com/swlh/flutter-vs-react-native-vs-native-deep-performance-comparison-990b90c11433

Flutter vs React Native vs Native:深度性能比較 - 天天要聞

Flutter vs React Native vs Native:深度性能比較 - 天天要聞

點個在看少個 bug

科技分類資訊推薦

剛上市被吐槽,開售直接賣爆,蘋果新款iPad補貼到2294元 - 天天要聞

剛上市被吐槽,開售直接賣爆,蘋果新款iPad補貼到2294元

每次蘋果推出新品,總有不少人在網絡上吐槽「沒創新」「貴得離譜」。但時間一到開售日,銷量曲線便會打所有人一個措手不及。iPad 系列也不例外,雖然人們口頭上說「真沒什麼新鮮的」,可門店裡和官網上,卻是一機難求,尤其是定價稍有調整時,更是迅速成
小米15強!618銷量僅次於蘋果16,拿下國產第一名 - 天天要聞

小米15強!618銷量僅次於蘋果16,拿下國產第一名

一年一度的618電商大促已經全面展開,手機市場迎來了年中最大一波換機潮。蘋果依舊穩居銷量榜首,在3000元、4000元、5000元甚至6000元以上各大價位段中,iPhone 15系列和iPhone 16系列牢牢佔據着頭部位置。這也再次印證
618取得開門紅,8GB+128GB+6600mAh,補貼至594元 - 天天要聞

618取得開門紅,8GB+128GB+6600mAh,補貼至594元

在如今的手機市場中,「性能至上」成了很多用戶換機的首要標準。然而,如果我們冷靜思考,不難發現,並非所有人都需要旗艦性能。對於老年用戶和未成年的學生群體來說,一款手機的「剛需」其實非常簡單,能看清屏幕、能打電話、能刷視頻、能續航長就夠了。
米粉盼來了,16GB+1TB,小米15Ultra頂配變相跌至5918元 - 天天要聞

米粉盼來了,16GB+1TB,小米15Ultra頂配變相跌至5918元

提起小米手機,多數人第一反應仍然是「性價比」三個字。的確,過去的小米在價格戰中一路拼殺,逐步贏得大眾用戶的青睞。然而在今天,小米已經不再是單一追求「便宜」的品牌,而是敢於正面對標蘋果、三星的高端旗艦品牌。
買賣二手手機,如何更安心 - 天天要聞

買賣二手手機,如何更安心

數據來源:商務部等製圖:蔡華偉山東濟南歷下區的一家手機店裡,市民黃育珍將舊手機交給店員。數據遷移、隱私清除……經過一系列操作,這部手機最終折抵800元。「我新換了台大屏手機,算上換新補貼和折舊費用,價格很合適。」黃育珍說。今年,消費品以舊換
從1U到整櫃,成都電信託管價格影響因素大揭秘 - 天天要聞

從1U到整櫃,成都電信託管價格影響因素大揭秘

成都電信服務器託管價格從1U到整櫃的變化,主要受到以下因素的綜合影響:1. 服務器規格機櫃空間:服務器佔用的機櫃空間越大,託管費用越高。1U服務器佔用空間最小,成本相對較低;而4U服務器佔用空間大,成本更高。