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

来源:https://www.cnblogs.com/mengqd/archive/2020/07/02/13222676.html
-Advertisement-
Play Games

老孟導讀:這是老孟翻譯的付費文章,文章所有權歸原作者所有。 歡迎加入老孟Flutter交流群,每周翻譯2-3篇付費文章,精彩不容錯過。 原文地址:https://medium.com/swlh/flutter-vs-react-native-vs-native-deep-performance-co ...


老孟導讀:這是老孟翻譯的付費文章,文章所有權歸原作者所有。

歡迎加入老孟Flutter交流群,每周翻譯2-3篇付費文章,精彩不容錯過。

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

讓我們比較流行的移動開發工具在日常生活中的FPS,CPU,記憶體和GPU性能。

研究背後的故事

inVerita及其移動開發團隊不斷研究市場上提供的跨平臺移動解決方案的性能,以回答哪種技術最適合您的產品,是 Flutter 或 React Native(或 Native)甚至是職業(原文是:maybe even career),這就是 Flutter vs React Native vs Native 第一篇文章出現的原因。是的,這頗有爭議,因為有人可以說我們不是每天使用React Native進行多次計算(可能是這種情況),但是在這種情況下,Flutter或Native應用程式可以更好地執行CPU繁重的任務。

因此,在本文中,我們決定研究UI的性能,該性能對日常使用移動應用程式的用戶影響更大。

衡量UI性能很複雜,這要求工程師在每個平臺上以相同的方式實現相同的功能。我們將 GameBench 作為測試工具,並確保我們保持客觀性(這並沒有改變我們在很多方面都非常喜歡Flutter的事實:),並且仍在運行許多React Native和Native項目)。 GameBench有很多改進空間,但我們的目標是設法將每個應用程式置於一個測試環境中。

源代碼是開放的,因此請嘗試並與我們分享您的想法。 UI動畫通常在不同平臺上使用不同的工具,因此我們將所有內容都縮小到每個平臺支持的庫中(但只有一種情況),或者至少我們做了能夠做到的一切。測試結果可能會有所不同,並且取決於您的實施方法,我們相信您作為特定技術的潛在真正專家可以將您的特定工具集推到極限,使其超過我們的數量,如果您這樣做,我們將非常高興。現在,讓我們看一下案例。

硬體信息:

為了進行測試,我們使用了價格合理的小米Redmi Note 5和iPhone 6s。

倉庫地址

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

用例1 —列表視圖基準

我們使用Native,React Native和Flutter在Android和iOS上實現了相同的UI。我們還使用Android上的RecyclerView.SmoothScroller來自動化滾動速度。在iOS和React Native上,我們使用了帶有計時器的方法,並以編程方式滾動到位置。在Flutter上,我們使用ScrollController平滑滾動列表。在每種情況下,我們在列表視圖中都有1000個項目,並且滾動時間相同以到達最後一個列表元素。在每種情況下,我們都使用每個平臺具有不同庫的圖像緩存。更多細節可以在源代碼中揭示。

在這種情況下使用的第三方庫:

iOS:

  • 載入和緩存圖像 — Nuke

Android:

  • 載入和緩存圖像 — Glide

React Native

  1. 所有測試均顯示出大致相同的FPS。
  2. 與Flutter和React Native相比,Android Native使用的記憶體只有一半。
  3. React Native需要最多的CPU開發。原因是在JS和本機代碼之間使用JSBridge,這會導致序列化和反序列化方面的資源浪費。
  4. 關於電池開發,Android Native具有最佳效果。 React-native落後於Android和Flutter。運行連續動畫會在React Native上消耗更多電池電量。
iPhone 6s test

  1. FPS,React Native的結果比Flutter和Swift差。原因是無法在iOS上使用IoT編譯。
  2. 記憶體。 Flutter與Native在記憶體消耗上幾乎一樣,但在CPU上仍然較重。在此測試中,React Native遠遠落後於Flutter和native。
  3. 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

Android
  1. Android和React Native在性能上有相似之處。很明顯,因為Lottie for React Native使用本地方式(16–19%CPU,30–29 FPS)。
  2. Flutter的結局令人驚訝,在演出中有點糟。 (12%的CPU和9 FPS)。

我們發現從網格中刪除一個特定的動畫會使Flutter上的FPS最高提高40%。我們認為Flare較重且未針對此類任務進行優化,這就是Flutter導致FPS下降的原因。

怪這一個:

  1. Android需要最少的記憶體(205 Mb); React Native需要280 Mb,Flutter需要266 Mb。
  2. 冷啟動應用程式。根據此指標,Flutter處於領先地位(2秒)。對於Android Native和React Native,大約需要4秒鐘。
iOS
  1. iOS和React Native在此測試中的結果幾乎與Lottie for React Native使用本地方法相同。
  2. Flare和Flutter不會令人驚訝。Flare 還有很長的一段路要走。
  3. iOS Native需要最少的記憶體量(48 Mb)。 React Native需要135 Mb,Flutter需要117 Mb。
  4. 冷啟動應用程式。根據此指標,Flutter處於領先地位(2秒)。對於iOS和React Native,大約需要10秒鐘。

請註意:在這種情況下,我們為Flutter使用了一個不同的庫,該庫比我們在其他平臺上使用的庫重得多,這可能是fps下降的原因。

用例3-更重的動畫會測試旋轉,縮放和淡入淡出。

在此測試中,我們比較了動畫200張圖像時的性能。刻度旋轉和淡入淡出動畫同時執行。

Android
  1. Native 顯示出最佳性能和最有效的記憶體消耗。
  2. Flutter顯示出非常接近本機fps,並且記憶體開銷增加了兩倍,但性能仍然不錯。
  3. React Native-在這種情況下表現不佳。

iOS
  1. iPhone 6s足夠強大,在所有3種情況下都不會降低fps。
  2. Native 使用的資源較少,而GPU則最多使用。
  3. React Native主要使用CPU進行渲染,而Flutter使用GPU。
  4. React Native使用了更多的記憶體。

總結

對於具有次要動畫和閃亮外觀的常規商務應用程式,技術根本不重要。但是,如果要製作一些繁重的動畫,請記住,Native具有最強大的性能。接下來是Flutter和React Native。我們絕對不建議在CPU繁重的操作中使用React Native,而Flutter從CPU和記憶體的角度來看都非常適合此類任務。

您選擇的工具取決於您的特定產品和業務案例。如果您要開發單平臺MVP,請使用Native,但請記住,Flutter應用程式可以為移動,Web和桌面環境構建,因此Flutter可能會成為跨平臺開發之王未來並非遙不可及,直到今天,Flutter還是對Native開發工具進行了非常不錯的競爭,尤其是在您的開發預算不太緊張但您仍在尋找應用程式性能不錯的情況下。

我們面對這樣一個事實,即可能有許多因素會影響每種技術的實施和基準,並且你們當中許多人可能是特定平臺的真正專家,他們可能會從更多受歡迎的工具中擠出更多的錢。我們通過為每個要測試的應用程式創建一個單一的環境以及一套用於衡量性能的工具,試圖為流程帶來儘可能多的透明度,我希望您喜歡這樣的結果。再一次,我們的移動團隊和Flutter團隊很高興收到並承擔您所有反饋和建議的重擔。

交流

老孟Flutter博客地址(330個控制項用法):http://laomengit.com

歡迎加入Flutter交流群(微信:laomengit)、關註公眾號【老孟Flutter】:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當下流行的前後端分離項目,常遇跨域問題,現從兩點,解決跨域問題 1.跨域本質:由於瀏覽器的同源策略 同源策略本是瀏覽器最基本的安全功能,是為了防止從一個域上載入另一個域上的信息,舉個例子:A有一個百寶箱,B有一個百寶箱,各自的百寶箱隨便取,但A要是取B的,或者B要是取A的,就會被拒絕 當協議,功能變數名稱, ...
  • 安裝了react-redux後,npm start報下麵錯誤 Failed to compile. ./node_modules/[email protected]@react-redux/es/connect/mapDispatchToProps.js Module not found: Can ...
  • 據統計,國外的前端開發人員和後端開發人員比例約為1:1,但是國內比例卻在1:3以下,web前端開發職位的人才缺口巨大。 根據網上統計數據,上海Web前端開發工程師這一職位的月平均收入為1.5萬元,工作經驗達到3年的web前端工程師甚至達到3萬元。 而且Web前端工程師一般工作1年左右,年薪一般就都能 ...
  • 作者:凹凸曼 - yuche 從 Taro 第一個版本發佈到現在,Taro 已經接受了來自於開源社區兩年多的考驗。今天我們很高興地在黨的生日發佈 Taro 3(Taro Next)正式版,希望 Taro 未來的更多兩年能像一名共產主義戰士一樣經受住更多的考驗。以下是 Taro 3 的一些新增特性: ...
  • css三大特性 層疊性: 如果一個屬性通過兩個相同選擇器設置到同一個元素上,相同的屬性就會出現衝突,那麼這個時候一個屬性就會將另一個屬性層疊掉,採用的是就近原則 繼承性: 子標簽會繼承父標簽的某些樣式 一般以font­,line­,color,text­,list­,都能繼承 備註 : a標簽不能繼 ...
  • 預覽地址 http://106.12.212.110:8077/#/ 上期我們說瞭如何創建項目並把各個項目的文件結構創建好後這期我們來說如何畫出圖中代寫線段 首先我們在src/components/Render.vue中添加一下引用 import zrender from 'zrender' imp ...
  • html簡述: HTML 指的是超文本標記語言 (Hyper Text Markup Language)是用來描述網頁的一種語言。 HTML 不是一種編程語言,而是一種標記語言 (markup language)。 標記語言是一套標記標簽 (markup tag)。 作用:網頁是由網頁元素組成的 , ...
  • 開放埠規劃: mysql-develop:3407 mysql-test: 3408 mysql-release: 3409 ps: 1.不推薦使用預設埠-3306,建議自定義埠 2.如果採用阿裡雲伺服器,在安全組開放埠 3.自建伺服器依據實際情況打開防火牆開放埠[各個系統防火牆不一樣,操 ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...