<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bhaskar gyan vardhan</title>
    <description>The latest articles on DEV Community by Bhaskar gyan vardhan (@anotherjsguy).</description>
    <link>https://dev.to/anotherjsguy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F125899%2Fa498be01-04e4-43e9-b0fb-2944f619d941.jpeg</url>
      <title>DEV Community: Bhaskar gyan vardhan</title>
      <link>https://dev.to/anotherjsguy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anotherjsguy"/>
    <language>en</language>
    <item>
      <title>React Native Memory profiling (JSC vs V8 vs Hermes)</title>
      <dc:creator>Bhaskar gyan vardhan</dc:creator>
      <pubDate>Mon, 22 Jul 2019 08:08:47 +0000</pubDate>
      <link>https://dev.to/anotherjsguy/react-native-memory-profiling-jsc-vs-v8-vs-hermes-1c76</link>
      <guid>https://dev.to/anotherjsguy/react-native-memory-profiling-jsc-vs-v8-vs-hermes-1c76</guid>
      <description>&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;We were facing memory issue with our Android app &lt;strong&gt;@WalmartLabs&lt;/strong&gt; since stock JSC was doing minimal garbage collection in Android. We tried lots of options to reduce the memory footprint of our app with no success.&lt;br&gt;
Problem become severe with react native flat list with lots of items (~1k in our case). Memory kept on growing with each navigation between the screens and not coming down even after clearing the data&lt;/p&gt;
&lt;h2&gt;
  
  
  Savior
&lt;/h2&gt;

&lt;p&gt;A Few weeks back, @kudochien tweeted about &lt;a href="https://www.npmjs.com/package/react-native-v8" rel="noopener noreferrer"&gt;react-native-v8&lt;/a&gt; package which can enable us to bundle V8 with react-native for android instead of JSC&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1142104750436970496-593" src="https://platform.twitter.com/embed/Tweet.html?id=1142104750436970496"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1142104750436970496-593');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1142104750436970496&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;During the same time &lt;a href="https://www.npmjs.com/package/jsc-android/v/245459.0.0" rel="noopener noreferrer"&gt;jsc-android&lt;/a&gt; also release a newer version 245459.0.0 and Hermes was announced during @ChainReactConf&lt;/p&gt;

&lt;p&gt;So we decided to compare memory footprints of &lt;a href="https://www.npmjs.com/package/jsc-android/v/241213.1.0" rel="noopener noreferrer"&gt;Stock JSC (v241213.1.0)&lt;/a&gt;,  new &lt;a href="https://www.npmjs.com/package/jsc-android/v/245459.0.0" rel="noopener noreferrer"&gt;JSC(v245459.0.0)&lt;/a&gt;,  &lt;a href="https://facebook.github.io/react-native/docs/hermes/" rel="noopener noreferrer"&gt;Hermes&lt;/a&gt; and &lt;a href="https://www.npmjs.com/package/react-native-v8" rel="noopener noreferrer"&gt;react-native-v8&lt;/a&gt; and created a sample repository to mimic real world use case. &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/bhaskarGyan" rel="noopener noreferrer"&gt;
        bhaskarGyan
      &lt;/a&gt; / &lt;a href="https://github.com/bhaskarGyan/react-native-memory-profile" rel="noopener noreferrer"&gt;
        react-native-memory-profile
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;react-native-memory-profile (JSC vs V8)&lt;/h1&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Checkout brach for which you want to do memory profiling&lt;/li&gt;
&lt;li&gt;npm i&lt;/li&gt;
&lt;li&gt;run server in seperate terminal with npm run start-server&lt;/li&gt;
&lt;li&gt;react-native run-android (for devlopment)&lt;/li&gt;
&lt;li&gt;cd android &amp;amp;&amp;amp; ./gradlew assembleRelease for release apk&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;To test apk without setup&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Download APK from respective branch under ${PROJECT_ROOT}/releaseAPK&lt;/p&gt;
&lt;p&gt;#Observations
&lt;a rel="noopener noreferrer" href="https://github.com/bhaskarGyan/react-native-memory-profile./MemoryProfilingResult/JSCvsV8vsHermes.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HSpLi-QR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/bhaskarGyan/react-native-memory-profile./MemoryProfilingResult/JSCvsV8vsHermes.png" alt="JSCvsV8vsHermes"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/bhaskarGyan/react-native-memory-profile" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
 &lt;br&gt;&lt;br&gt;
We considered below use cases.

&lt;ol&gt;
&lt;li&gt;Flat list with ~1k items&lt;/li&gt;
&lt;li&gt;Huge array list to mimic storing/removing large record (one record was new Array(999999).join('--')) in react state&lt;/li&gt;
&lt;li&gt;Memory footprint with &lt;a href="https://www.npmjs.com/package/react-navigation" rel="noopener noreferrer"&gt;react-navigation&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ABI used -&amp;gt; x86_64
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Observations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  TL;DR
&lt;/h3&gt;

&lt;p&gt;New JSC v241213.1.0 handle memory better than its previous version v241213.1.0, followed by Hermes but react-native-v8 beat them by a huge margin in app startup memory, handling memory of flat list, memory footprint of large data and most importantly Garbage collection&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1146656548556439553-958" src="https://platform.twitter.com/embed/Tweet.html?id=1146656548556439553"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1146656548556439553-958');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1146656548556439553&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  Sample APP
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v5iXAwJB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://pbs.twimg.com/media/D-m3YUFVUAIpRYW.jpg:small" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v5iXAwJB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://pbs.twimg.com/media/D-m3YUFVUAIpRYW.jpg:small" alt="Sample APP" width="394" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Home -&amp;gt; flat list&lt;/li&gt;
&lt;li&gt;Scroll till last item (870 items) -&amp;gt; Home&lt;/li&gt;
&lt;li&gt;Memory hungry Array -&amp;gt; add record (100) -&amp;gt; remove -&amp;gt; Home&lt;/li&gt;
&lt;li&gt;flat list -&amp;gt; Memory hungry Array -&amp;gt; add record (100) -&amp;gt; Home&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stock JSC (v241213.1.0)
&lt;/h3&gt;

&lt;p&gt;It was the worst performer among three. Memory footprint was very High and minimal Garbage collection&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App startup memory(MB)&lt;/strong&gt; - 59 (total), 20 (JS)&lt;br&gt;
&lt;strong&gt;After flat list loaded(MB) (870 items)&lt;/strong&gt; -&amp;gt; 239(Total),128 (JS)&lt;br&gt;
&lt;strong&gt;After adding records (app crashed after adding 16 records) (MB)&lt;/strong&gt; -&amp;gt; 1153(Total),1098(JS)&lt;br&gt;
&lt;strong&gt;Garbage collection&lt;/strong&gt; - minimal&lt;/p&gt;

&lt;h4&gt;
  
  
  Memory consumption graph
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flinzrvsigvynekhkve78.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flinzrvsigvynekhkve78.png" alt="Stock JSC" width="800" height="645"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  New JSC (v245459.0.0)
&lt;/h3&gt;

&lt;p&gt;It was better than Stock JSC in handling memory and Garbage collection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App startup memory(MB)&lt;/strong&gt; - 53 (total), 15 (JS) &lt;br&gt;
&lt;strong&gt;After flat list loaded(MB) (870 items)&lt;/strong&gt; -&amp;gt; 191(Total),107 (JS)&lt;br&gt;
&lt;strong&gt;After adding records (MB)&lt;/strong&gt; -&amp;gt; 714(Total),596(JS)&lt;br&gt;
&lt;strong&gt;Garbage collection&lt;/strong&gt; -&amp;gt; Yes, memory came down to 234 MB (Total), 121 MB (JS)&lt;/p&gt;

&lt;h4&gt;
  
  
  Memory consumption graph
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fygsvdzfh7e80e0fb6rx4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fygsvdzfh7e80e0fb6rx4.png" alt="New JSC (v245459.0.0)" width="800" height="645"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  React-Native-V8
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;App startup memory(MB)&lt;/strong&gt; - 40 (total), 9 (JS) [↓ 55% (JS)]&lt;br&gt;
&lt;strong&gt;After flat list loaded(MB) (870 items)&lt;/strong&gt; -&amp;gt; 105(total), 36 (JS) [↓ 70% (JS)]&lt;br&gt;
&lt;strong&gt;After adding records (100)&lt;/strong&gt; -&amp;gt; 82(total),25(JS) [GC ran in-between]&lt;br&gt;
&lt;strong&gt;Garbage collection&lt;/strong&gt; -&amp;gt; Yes,max memory reached 103 MB(total), 36 MB(JS) and after GC around 78 MB(total),14 MB(JS)&lt;/p&gt;

&lt;h4&gt;
  
  
  Memory consumption graph
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthw4lyue8megbikfsv7q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthw4lyue8megbikfsv7q.png" alt="React-Native-V8" width="800" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hermes
&lt;/h3&gt;

&lt;p&gt;Hermes was announced @ChainReactConf on 11th July. It is an open-source JavaScript engine optimized for running React Native apps on Android.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App startup memory(MB)&lt;/strong&gt; - 33 (total), 7 (JS) [↓ 65% (JS)]&lt;br&gt;
&lt;strong&gt;After flat list loaded(MB) (870 items)&lt;/strong&gt; -&amp;gt; 397(total), 110 (JS)&lt;br&gt;
&lt;strong&gt;After GC (MB) ** -&amp;gt; 358 (total), 48 (JS)&lt;br&gt;
**After adding records (app crashed after adding 50 records)&lt;/strong&gt; -&amp;gt; 556(total),149(JS) &lt;br&gt;
&lt;strong&gt;Garbage collection&lt;/strong&gt; -&amp;gt; Yes,max memory reached 556 MB(total), 149 MB(JS) and after GC around 143 MB(total),48 MB(JS)&lt;/p&gt;

&lt;h4&gt;
  
  
  Memory consumption graph
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff820fz4uw76h0ckwk52p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff820fz4uw76h0ckwk52p.png" alt="Hermes" width="800" height="824"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion:
&lt;/h2&gt;

&lt;p&gt;Based on the memory profiling graph react-native-v8 is the winner closely followed by Hermes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2e7xbat1zwrrkpw6as7x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2e7xbat1zwrrkpw6as7x.png" alt="V8vsJSCvsHermes" width="800" height="829"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But,there is no one silver bullet for choosing JS engine in react-native it all depends on ones use-case. It is very important to measure your app performance against different JS engine and go with the one which suites you the best.&lt;/p&gt;

&lt;p&gt;It's good that now react-native is giving options to the user to choose JS engine based on the use case.&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>javascript</category>
      <category>performance</category>
      <category>memory</category>
    </item>
  </channel>
</rss>
