Introducción
Todos sabemos que el desarrollo de una aplicación con una sola ramificación (En su mayoría un único repositorio principal donde se programa tanto para iOS como para Android), tiene una serie de ventajas tales como:
Redución de tiempos
Reducción de Bugs
No hay que preocuparnos por 2 desarrollos con sus respectivos problemas, tenemos un solo repo.
Reducción de costes debido a que se necesita menos personas para poder desarrollar la aplicación.
No necesitamos 2 equipos para cubrir iOS y Android.
El mantenimiento es menos complejo y más fácil de seguir.
Las mejoras y modificaciones requieren menos recursos que se reflejan en un presupuesto más amigable.
La curva de aprendizaje es menor.
Son tecnologías nuevas y eso permite aprenderlas con más facilidad y por supuesto es más fácil aprender 1 cosa que 2.
Ahora bien el desarrollo nativo también tiene otras ventajas como:
Control total sobre las dificultades técnicas que puedan existir.
Flexibilidad total en la aplicación.
Un diseño especializado para cada plataforma.
El rendimiento.
Esto es lo que vamos a poner a prueba.
Ahora bien, el rendimiento es una cuestión compleja de definir y por tanto lo dividiremos en 3 factores.
Rendimiento
Interacción con API
Como la aplicación interactúa con el API del teléfono, algunos ejemplos serían:
Acceso a fotos.
Sistema de archivos.
Obtención de ubicación GPS.
Acceso a la cámara.
Entre otras.
Velocidad de renderizado
Este criterio define las transiciones del UI de la aplicación, como puede ser:
Suavidad de animaciones.
Fluidez de los efectos de interfaz.
Frames por segundo entre:
Componentes
Pantallas
Lógica de aplicación
Comprende la velocidad de los cálculos matemáticos y manipulaciones de memoria. Toma mucha importancia en aplicaciones con una lógica compleja. Ejemplos de ello puede ser una aplicación de venta de embalaje:
A simple vista puede parecer sencillo ya que no es más que un Ecommerce con una serie de productos, pero cualquiera que ha trabajado con un modelo de negocio parecido sabrá que la complejidad no está en el Ecommerce en sí. Si no en su tarificador, cada producto puede tener miles de categorías y cada una de ellas sub-categorías que cambian tanto el precio como la presentación de la venta. También dependiendo del mínimo de venta se tendrá una rama de precios u otra, lo mismo en la combinación de productos que sea pueda comprar.
En una aplicación así, la interfaz no es lo complejo, ya que su renderizado no será problema: Son productos X con una descripción Y, el problema es toda la lógica que hay detrás para que la venta no necesite de ninguna fuente humana que valide el proceso y el cliente pueda comprar con libertad.
(Es un error típico donde empresas y freelancers novatos caen por considerar solamente la funcionalidad general y el número de pantallas de la aplicación y terminan con sorpresas para nada gratas que afectan la velocidad del desarrollo, el alcance del mismo, el coste y por supuesto la motivación).
Volviendo a nuestro tema, ahora que hemos definido el rendimiento, vamos con las pruebas:
Prueba intensiva de CPU (algoritmo Gauss – Legendre) para iOS
iOS
Objective-C como podemos apreciar es el mejor lenguaje de programación para el desarrollo de iOS. Swift es 1.7 veces más lento en comparación con Objective-C.
¡La sorpresa! Flutter es más rápido que Swift, un 15% más rápido.
React Native ha quedado en último puesto y no "por poco", realmente ha quedado muy por debajo siendo 20 veces más lento que Objective-C.
Prueba intensiva de CPU (Algoritmo de Borwein) para iOS
iOS
Objective-C es otra vez la mejor opción para el desarrollo de aplicaciones iOS.
Swift es 1.9 veces más lento en comparación con Objetive-C.
Flutter es 5 veces más lento que Swift.
React Native es más de 15 veces más lenta que la versión de Swift.
Prueba intensiva de CPU (Algoritmo Gauss - Legendre) para Android
Android
Java, Kotlin y Flutter tienen rendimientos similares y son las mejores opciones para el desarrollo Android.
Flutter vuelve a sorprender con un rendimiento de escándalo, solo un 20% más lento que el desarrollo nativo.
React Native es aproximadamente 15 veces más lento que el nativo, muy por debajo de sus tres competidores.
Prueba intensiva de CPU (algoritmo de Borwein) para Android
Android
Java y Kotlin tienen un rendimiento parecido y se presentan como la mejor opción para el desarrollo.
Las opciones nativas son casi el doble de rápidas que Flutter, no siendo ni mucho menos Flutter un mal contrincante.
React Native vuelve a estar en la cola, siendo aproximadamente 6 veces más lento que las opciones nativas.
Detalles técnicos de la prueba
Todas las pruebas se han realizado en dispositivos físicos reales, los dispositivos son: Iphone 6s IOS 13.2.3, Xiaomi Redmi Note 5 con Android 9.0.
Hemos hecho las mediciones de rendimiento en las Release Builds.
Todas las pruebas se ejecutaron varias veces y se calculó el resultado promedio.
Se utilizaron algoritmos de Gauss-Legendre y Borwein para calcular los números de Pi. El número Pi se ha calculado 100 veces con una precisión de 10 millones de dígitos.
Gauss-Legendre es un algoritmo que requiere más memoria en comparación con Borwein, pero Borwein es más intensivo en CPU.
El código fuente que hemos usado es el siguiente:
Conclusiones
En resumen, no todas las Cross-plataforms son lentas o una mala elección. Flutter ha tenido un rendimiento excelente en todas las pruebas, llegando a ganar algunas de ellas. Esto más la cantidad de ventajas que tiene por ser un desarrollo Cross-Plataform hacen de Flutter una tendencia y una tecnología atractiva en casi cualquier caso.
¿Porque Flutter es tan bueno?
Dentro del corazón de Flutter está Dart que tiene como una de sus grandes ventajas la compilación usando las bibliotecas nativas de C/C++ que permiten estar más cerca del lenguaje de máquina y obtener un rendimiento nativo.
Flutter aunque ha llegado recientemente al mercado (Diciembre 2018): Tiene más de 7500 forks, más de 65000 estrellas en Github y más de 1400 paquetes disponibles en el repositorio de Dart, esto nos muestra lo involucrada que está la comunidad y como vitaminan a Flutter.