<?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>Forem: Gabriel Bonin</title>
    <description>The latest articles on Forem by Gabriel Bonin (@bonindev).</description>
    <link>https://forem.com/bonindev</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%2F1915166%2F2693a132-abca-4c65-8400-79c3c977c005.jpg</url>
      <title>Forem: Gabriel Bonin</title>
      <link>https://forem.com/bonindev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/bonindev"/>
    <language>en</language>
    <item>
      <title>Medindo o desempenho de um aplicativo em React Native</title>
      <dc:creator>Gabriel Bonin</dc:creator>
      <pubDate>Sun, 11 Aug 2024 23:38:13 +0000</pubDate>
      <link>https://forem.com/bonindev/medindo-o-desempenho-de-um-aplicativo-em-react-native-336c</link>
      <guid>https://forem.com/bonindev/medindo-o-desempenho-de-um-aplicativo-em-react-native-336c</guid>
      <description>&lt;h2&gt;
  
  
  Por que é importante dar atenção ao desempenho de um Aplicativo?
&lt;/h2&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%2Fyl0ipgznv29y4u5w06pd.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%2Fyl0ipgznv29y4u5w06pd.png" alt="Image description" width="672" height="712"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Diferença de desempenho entre dispositivos android x iOS
&lt;/h2&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%2Fywsgnb1tlkra5e3awb7s.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%2Fywsgnb1tlkra5e3awb7s.png" alt="Image description" width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Impactos de um aplicativo com baixo desempenho
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Afeta diretamente a experiência do usuário&lt;/li&gt;
&lt;li&gt;Avaliação (nota baixa) nas plataformas&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1% de atraso no carregamento de uma página ou tela pode causar:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;11% de perda de visualização &lt;/li&gt;
&lt;li&gt;16% de diminuição na satisfação do cliente&lt;/li&gt;
&lt;li&gt;7% de perda em conversões&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Como melhorar o desempenho de um Aplicativo?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt; Reduzir o numero de renderizações e re-renderizações&lt;/li&gt;
&lt;li&gt; Utilizar Flatlist ao invés de ScrollView&lt;/li&gt;
&lt;li&gt; Explorar Partitioning e Lazy Loading (Aplicações que utilizam muita memória&lt;/li&gt;
&lt;li&gt;Otimizar Imagens (&lt;a href="https://github.com/DylanVann/react-native-fast-image#readme" rel="noopener noreferrer"&gt;FastImage&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Utilizar Componentes Nativos sempre que possível (Text, View, Scroll, Flatlist, Image)&lt;/li&gt;
&lt;li&gt;Diminuir a utilização de bibliotecas de terceiros&lt;/li&gt;
&lt;li&gt;Otimizar o código Java Script (RN-Debugger, Hermes, etc)
&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%2F70d2dlwm6ay5ymhsrdde.png" alt="Image description" width="800" height="443"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ferramentas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fbflipper.com/docs/features/react-native/" rel="noopener noreferrer"&gt;FB Flipper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JS Thread&lt;/li&gt;
&lt;li&gt;&lt;a href="https://react.dev/learn/react-developer-tools" rel="noopener noreferrer"&gt;React Developer Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JS flame graph&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bamlab/react-native-flipper-performance-monitor" rel="noopener noreferrer"&gt;React Native Performance Monitor Flipper plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Métricas
&lt;/h2&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%2Ftq7cgck5439e9qefrb25.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%2Ftq7cgck5439e9qefrb25.png" alt="Image description" width="800" height="90"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Emular ou utilizar um dispositivo "fraco" (Ex: Samsung J3 2017)&lt;/li&gt;
&lt;li&gt;Desligar o JS DEV-MODE &lt;/li&gt;
&lt;li&gt;Aguarde o início da renderização do componente e depois inicie os testes&lt;/li&gt;
&lt;li&gt;Tempo médio indicado para testes: 10 segundos&lt;/li&gt;
&lt;li&gt;Em caso de Listas (Flatlists/ScrollView) deslize os itens da lista para cima e para baixo manualmente ou utilize comandos:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; adb shell input swipe 500 1000 300 300 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(varia com o tamanho e tipo de device)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Repita os testes entre 3 e 5 vezes&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Casos de uso
&lt;/h2&gt;

&lt;p&gt;Análise de desempenho em:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Componente com Flatlist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de aplicar métricas de desempenho:&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%2Fad0mwsjpu81kg2j5bpsk.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%2Fad0mwsjpu81kg2j5bpsk.png" alt="Image description" width="756" height="814"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após aplicar métricas de desempenho:&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%2F0ezjw2k97tb18f2an434.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%2F0ezjw2k97tb18f2an434.png" alt="Image description" width="769" height="820"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Componente de Player de video customizado
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de aplicar métricas de desempenho:&lt;br&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%2F9o8v40d1niyy42jax4zb.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%2F9o8v40d1niyy42jax4zb.png" alt="Image description" width="800" height="871"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após aplicar métricas de desempenho:&lt;br&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%2Fjixr01i804b5kwroku8a.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%2Fjixr01i804b5kwroku8a.png" alt="Image description" width="800" height="840"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resultado analisado pelo plugin React Native Performance Monitor Flipper plugin&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%2Fe0k0yccf8c24wozc0p0t.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%2Fe0k0yccf8c24wozc0p0t.png" alt="Image description" width="489" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtu.be/KNmrainox2M" rel="noopener noreferrer"&gt;SIX mind-blowing React Native optimization hacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=5Q3VCgKV0GE" rel="noopener noreferrer"&gt;Measuring and Improving React Native Performance | Alexandre Moureaux | App.js Conf 2022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=DXhcbMvNX04" rel="noopener noreferrer"&gt;React Native Performance Optimisation (useMemo, useCallback, memo)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>reactnative</category>
      <category>performance</category>
      <category>fbflipper</category>
      <category>perfmonitorflipperplugin</category>
    </item>
  </channel>
</rss>
