SlideShare a Scribd company logo
1 of 73
Optimizando Apps con
Xamarin.Forms
ORGANIZATION
PLATINUM SPONSORS
Thank you!
COLLABORATORS
@jsuarezruiz
javiersuarezruiz@hotmail.com
Trabajo en Microsoft en Visual Studio para macOS.
Coordinador de CartujaDotNet, comunidad .NET de Sevilla y de
SVQXDG, comunidad Xamarin de Sevilla.
Javier Suárez
Senior Software Engineer at Microsoft
Oops!. Problema con
el rendimiento
•Normalmente, el rendimiento es un punto
que se suele tener en cuenta “al final” y “si es
necesario”.
•El objetivo de esta sesión sera que te quedes
con consejos, ideas y factores a tener en
cuenta para que la preocupación por el
rendimiento se traslade durante todo el
desarrollo.
¿Qué vamos a ver?
1.XAMLC
2.Bindings
3.Fast Renderers
4.Images
5.Layouts
6.CollectionView (y ListView)
7.Visual
8.Shell
9.Startup
10.Peticiones Http
11.Otros (IoC, Custom Renderers, etc)
Suma y sigue. No hay
“magia”.
• Vamos a ver una sucesión de ideas y
consejos relacionadas con Xamarin.Forms.
de los puntos vistos os daran pequeñas
mejoras en el rendimiento. No hay “líneas
mágicas”, hablamos de un “suma y sigue”.
• Cambio a cambio si se consiguen
resultados.
Xamarin Classic
Base de código C# compartido
100% de acceso a APIs nativas
Alto rendimiento
iOS C# UI Windows C# UIAndroid C# UI
Código compartido C#
Interfaces dependientes de código
nativo
Xamarin.Forms
Más código compartido. UI XAML o C#
Data Binding & MVVM
Abstracciones (Navegación, etc.)
iOS C# UI Windows C# UIAndroid C# UI
Código compartido C#
Rendimiento < Xamarin.Classic
UI Compartida
A tener en cuenta...
•Hay que tener en cuenta la capa de abstracción.
•No se puede desarrollar absolutamente todo sin pensar en que
hay “debajo”.
•Hay que utilizar los controles adecuados en cada caso.
•El árbol visual debe ser parte de nuestra responsabilidad.
•A veces es necesario código nativo en forma de Custom
Renderers o Effects.
Las claves.
Step
VS 2017
15.8
VS 2019 16.0 Diferencia
Primera Build 01:04.20 00:50.13 -21.95%
Incremental Build
(Cambios en
XAML)
00:10.62 00:07.47 -29.66%
Despliegue
(Cambios en
XAML)
00:09.03 00:04.44 -50.83%
SmartHotel Reference App
XAMLC
Compilación de XAML
Si defines la interfaz de usuario de la aplicación Xamarin.Forms con XAML tienes la
opción de utilizar XamlCompilationOptions.
Cuenta con dos valores:
• Compile.
• Acelera la carga de elementos visuales.
• Reduce el tamaño del paquete.
• La compilación (AOT) es más larga.
• Skip.
• Valor por defecto para mantener retocompatibilidad.
• No hay validación en tiempo de ejecución de XAML.
XAMLC
Compilación de XAML
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
Detalles:
• TipCalc en Android.
• JIT.
• Tiempo calculado
con
InitializeComponent()
.
• Tiempo medio de 5
medidas.
• Oneplus 6.
Bindings
Bindings y MVVM
• Binding es una características incluida en Xamarin.Forms.
• Permite crear asociaciones entre una Fuente y un destino.
• Permite aplicar MVVM desacoplando Modelo y Vista
interponiendo una capa intermedia, la ViewModel.
Propiedad pública
BindableProperty
Source
TargetBinding
OneWay
TwoWay
OneWayToSource
Bindings, el funcionamiento
public abstract class BindableObject : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
//...
}
“No enlaces cosas que se pueden establecer de forma estática”
Jason Smith - Evolve 2016
Bindings
Detalles:
• El sistema de Bindings es
rápido, pero tiene un
costo en el rendimiento.
• Los errores de enlace a
datos tienen impacto en el
rendimiento.
• En ocasiones, evitar el
enlace a datos ayuda a
mejorar el rendimiento
(Ejemplo: listado con celda
personalizada).
Fast Renderers
Fast Renderers
Hablamos de cambios realizados en Xamarin.Forms con el
objetivo de reducir a mínimos el número de operaciones y
cálculos a realizar para renderizar el control y gestionar su
tamaño y posición.
¿Qué aporta?
Pre Fast Renderers (Label)
OnLayout();
OnLayout();
ViewRenderer
MeasureAndLayout();
ViewRenderer
OnLayout();
ViewElementRenderer
UpdateLayout();
LabelRenderer
Post Fast Renderers (Label)
OnLayout();
OnLayout();
ViewRenderer
Fast Renderers
Detalles:
• Tiempo de incialización
y creación de la vista.
• Android.
• JIT.
• Tiempo tomado de 5
medidas.
• One Plus 6.
• Se usan por defecto en
Xamarin.Forms 4.0!
Images
Images
Detalles:
• La opción más sencilla y directa
de mejorar la gestión de
imágenes es usando
FFImageLoading.
• GlideX tiene mejor rendimiento
que FFImageLoading en Android.
• Gracias a IImageSourceHandler
se puede personalizar que usar
para la gestión de ImageSource
en cada plataforma. Por ejemplo,
usar FFImageLoading en iOS y
GlideX en Android.
• Se esta trabajando activamente
en mejorar la gestión de
imágenes en Xamarin.Forms.
Reducción en un 15% de media
en el uso de memoria en la v4.0
en comparación a v3.6.
IImageSourceHandler
Desde Xamarin.Forms 2.3.5, tenemos la interfaz IImageSourceHandler. Permite implementar ImageSource en
la plataforma.
Las claves.
public class ImageSourceHandler : IImageSourceHandler
{
public Task<UIImage> LoadImageAsync(
ImageSource imageSource,
CancellationToken cancellationToken = new CancellationToken(),
float scale = 1)
{
return LoadUsingFFImageLoading(
imageSource, cancellationToken);
}
...
} ExportImageSourceHandler
DEMO: Images
Layouts
Layout
• Un Layout representa un nodo en el árbol
visual.
• Un Layout cuenta con propiedades y eventos
que permiten definer su comportamiento.
• Es el responsible de gestionar la ubicación y el
tamaño de nodos secundarios.
• Ejemplos: StackLayout, Grid, etc.
El ciclo de vida de un Layout
La creación de un Layout en Xamarin.Forms pasa por dos
fases diferentes:
• Ciclo de invalidación: En el árbol visual, el ciclo de
invalidación es el proceso de notificación
recursivamente hacia el nodo padre.
• Ciclo de Layout: Tras invalidar, se procede a la
reorganización de elementos marcados como
“invalidados”.
Ciclo de invalidación
SiNo
Ciclo de Layout
NoSi
Por cada hijo
Layout.Children
Grid
El Grid organiza los elementos hijos en filas y columnas.
Permite crear estructuras complejas sin necesidad de grandes
anidaciones.
El tamaño de cada fila y columna es importante, y afecta al
rendimiento. Hay que cuidar la utilización de celdas y filas.
Consejos Grid
El Grid organiza los elementos hijos en filas y columnas.
La invalidación de una de las View hijas provoca la
invalidación en cadena del árbol visual de la rejilla.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Button
Text="Button 1"/>
<Label
Grid.Row="1"
Text="Button 2"/>
</Grid>
Consejos Grid
El Grid puede organizar los elementos con tamaño
proporcional a la View. El Grid ignora cualquier notificación
de invalidación de sus hijos.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Button
Text="Button 1"/>
<Button
Grid.Row="1"
Text="Button 2"/>
</Grid>
Consejos Grid
El Grid puede organizar los elementos con tamaño fijo. El
Grid ignora cualquier notificación de invalidación de sus
hijos.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="150"/>
<RowDefinition Height="150"/>
</Grid.RowDefinitions>
<Button
Text="Button 1"/>
<Button
Grid.Row="1"
Text="Button 2"/>
</Grid>
StackLayout
El StackLayout organiza los elementos hijos una sóla
fila o columna.
Ideal para la creación sencilla y de forma rápida de
forma secuencial.
CUIDADO!, puede llevar a la anidación excesiva.
Consejos StackLayout
El StackLayout organiza los elementos hijos una sóla
fila o columna.
La invalidación de un View hijo provoca la
invalidación en cadena en el árbol visual hasta el
StackLayout.
<StackLayout>
<Button
Text="Button 1"/>
<Button
Text="Button 2"/>
</StackLayout>
RelativeLayout
El RelativeLayout organiza los elementos hijos en
base a relaciones entre los diferentes elementos y
el contenedor.
Ideal cuando el tamaño o el posicionamiento dbe
ser dinámico y adaptarse a diferentes condiciones.
Rendimiento bajo. Alto consume de CPU.
Layouts
Detalles:
• No uses un StackLayout para un
único hijo.
• No uses un Grid cuando el
StackLayout hace el trabajo.
• No uses varios StackLayout
cuando un Grid cumple.
• RelativeLayout tiene el peor
rendimiento. Alto consumo de
CPU.
• FlexLayout, no es el vencedor en
cuanto a rendimiento aunque
dada su flexibilidad y
rendimiento es una opción
altamente recomendada.
• En caso de posicionar pudiendo
usar posiciones absolutas,
AbsoluteLayout no tiene rival.
CollectionView (&
LisrtView)
ListView
• Salto cualitativo con Xamarin.Forms 2.0 donde se
añadieron opciones como la reutilización de celdas.
• La reutilización de celdas viene definida por la propiedad
ListViewCachingStrategy que cuenta con dos posibles
valores:
• RecycleElement
• RetainElement
<ListView CachingStrategy="RecycleElement"/>
Consejos ListView
• En determinadas ocasiones se requiere contenido
adicional al ListView en la parte superior y/o inferior. Es
recomendable utilizar las propiedades HeaderTemplate y
FooterTemplate para ello.
• Envolver al control ListView en un ScrollView rompe la
virtualización!
Consejos ListView
<ScrollView>
<StackLayout>
<Label Text="Header" />
<ListView />
<Label Text="Footer" />
</StackLayout>
</ScrollView>
<ListView Header="Header" Footer="Footer">
<ListView.HeaderTemplate>
<DataTemplate>
<Label Text="{Binding .}" />
</DataTemplate>
</ListView.HeaderTemplate>
<ListView.FooterTemplate>
<DataTemplate>
<Label Text="{Binding .}" />
</DataTemplate>
</ListView.FooterTemplate>
</ListView>
Consejos ListView
• Se recomiendo utilizer IList<T> como ItemsSource en
lugar de IEnumerable.
• Si se utiliza RecycleElemement, se aumenta el
rendimiento eliminando el Binding de la celda y utilizano
OnBindingContextChanged.
• No uses un TableView si puedes utilizar un ListView.
• Soporta layouts Horizontal/Vertical
• Soporte a multiples columnas/filas de elementos
• Es como una versión moderna de ListView
• No es necesario usar Cells
• Se usan Views y DataTemplates
• Mejora considerable en el rendimiento.
https://github.com/xamarin/Xamarin.Forms/issues/3172
CollectionView
Detalles:
• Media de 5 medidas.
• La gestión de celdas es mucho
más eficiente en
CollectionView, es la clave.
• El consumo de memoria es
inferior al usar CollectionView
con respecto a ListView.
• Los tiempos necesarios para
renderizado de celdas, es más
óptimo en CollectionView.
• Tras medir también el tiempo
de arranque de la App, es
también ligeramente mejor en
CollectionView.
Visual
Actualmente, muchas aplicaciones se ven a nivel estético exactamente
igual en todas las plataformas. En Xamarin.Forms, para conseguir este
resultado, en ocasiones hacen falta Custom Renders o efectos (código
específico de plataforma) para conseguirlo.
Por ese motivo, llega una nueva opción para conseguir la misma interfaz
de usuario en diferentes plataformas sin necesidad de requerir tanto a
Custom Renders o efectos.
Original - Gmail
¿Cómo usar Visual?
FormsMaterial.Init();
<ContentPage Visual=“Material”>
…
</ContentPage>
Los valores posibles de la propiedad Visual:
• Default : indica que la vista debe presentarse mediante el representador predeterminado.
• MatchParent : indica que la vista debe utilizar el representador mismo como su elemento primario directo.
• Material : indica que la vista debe representar con un procesador de material.
Visual
Detalles:
• Media de 5 medidas.
• Todos los renderers de Visual
son Fast Renderers.
• Los renderers de Visual tienen
un rendimiento general mejor
que los de por defecto (salvo el
Entry).
• La gestión de recursos
(eventos, dependencias, etc.)
es mejor en los renderers en
Visual, impacta en el consumo
de memoria. Mejor con Visual.
DEMO: Visual
Shell
Facilita la creación de la estructura de la aplicación
• Un lugar común donde describir la estructura de la
aplicación.
• Servicio de navegación con deep linking.
• Gestión de búsquedas integradas.
• Mejor rendimiento
• Facilitar crear Layouts complejos
• Navegación con Flyout y pestañas
• URL routed navigation, deep linking
• Mejoras en la navegación, gestion de
navegar atrás
• Search handler
• Snackbar
• Bottom Sheet
• Floating Action Button
• Left Bar Button
• Screen segues
• Transiciones de páginas
• Nueva API de gestos
• Además de todo lo que ya era posible
con Xamarin.Forms antes
Shell
Detalles:
• Datos tomados de 5 medidas
en Android.
• Rendimiento mejor en iOS que
en Android.
• Shell tiene un consumo de
memoria medio más bajo.
• El tiempo de arranque es
ligeramente mejor en iOS y a
su ves ligeramente peor en
Android que sin usar Shell.
Startup
Startup
• La opción compilación AOT habilita la compilación Ahead Of Time de los
ensamblados. Cuando esta opción está habilitada, la sobrecarga de inicio
Just-In-Time (JIT) se minimiza al precompilar ensamblados antes del tiempo
de ejecución. El código nativo resultante se incluye en el paquete (APK)
junto con los ensamblados sin compilar. Esto da como resultado un tiempo
de inicio de la aplicación más reducido, pero a costa de tamaños APK más
grandes.
• A costa de tiempos de compilación más lentos, el compilador de
optimización de LLVM debe crear un código compilado más pequeño y
rápido.
Startup (tiempo de arranque)
Detalles:
• AOT reduce casi a la mitad el
tiempo de arranque!.
• AOT incrementa el tamaño del
paquete!.
• La optimización LLVM tiene un
ligero impacto en el tiempo de
arranque, aunque nos ayuda a
tener un paquete más ligero.
DEMO: Startup
Peticiones Http
Peticiones Http
Detalles:
• La reutilización de HttpClient nos ayuda
a reducir drásticamente los tiempos.
Esto se debe a que segregará las cosas
de las que cada servidor puede
depender, como las cookies o
DefaultRequestHeaders.
• Un error común al trabajar con
HttpClient es descargar el contenido del
Json en una cadena. El problema es que
esto crea una cadena de todo su
documento JSON innecesariamente.
Impacta en el tiempo y la memoria a
utilizar. Usar Streams directamente.
• Usar GZIP siempre que sea posible.
• Usar Xamarin's Native
HttpMessageHandlers.
Otros
IoC
Detalles:
• Valor tomado de la media de 5
medidas.
• Aunque con limitaciones,
DependencyService de
Xamarin.Forms tiene un
rendimiento muy bueno.
• Entre las librerías más
utilizadas, TinyIoC o DryIoC
entre otras destaca como una
de las más rápidas.
Custom Renderers
protected override void OnElementChanged (ElementChangedEventArgs<NativeListView> e)
{
base.OnElementChanged (e);
if (Control == null) {
// Instantiate the native control
}
if (e.OldElement != null) {
// Unsubscribe from event handlers and cleanup any resources
}
if (e.NewElement != null) {
// Configure the control and subscribe to event handlers
}
}
Compresión de Layout
• Layout Compression permite indicar elementos con anidamiento
innecesario y optar a no crear layout. Con esta opción habilitada los layouts
se optimizarán en tiempo de compilación permitiendo obtener un mejor
rendimiento en tiempo de ejecución.
• Layout Compression elimina layouts encargados de gestionar aspectos
como gestos, etc. Si tu Layout utiliza las propiedades Rotation, Scale,
TranslationX o TranslationY (entre otras), no es un buen candidato.
<Grid
CompressedLayout.IsHeadless="true">
</Grid>
Compresión de Layout
<ContentView ...>
<StackLayout>
<StackLayout ...>
<AbsoluteLayout ...>
<Button ... />
<Image ... />
<Image ... />
<BoxView ... />
<Label ... />
<Button ... />
</AbsoluteLayout>
</StackLayout>
<Label ... />
</StackLayout>
</ContentView>
17 views 14 views (8 utilizando
Fast Renderers)
Recuerda!
• Muchos de los puntos vistos os daran
pequeñas mejoras en el rendimiento. No hay
“líneas mágicas”, hablamos de un “suma y
sigue”.
• Cambio a cambio si se consiguen resultados.
Código
https://github.com/jsuarezruiz/xamarin-forms-perf-playground
• Detalles:
• Más de una docena
de ejemplos.
• Varios Profilers para
medir tiempo de
arranque, memoria
consumida, jerarquía
de elementos, etc.
• Xamarin.Forms
incluye Profiler en
v4.2
https://github.com/x
amarin/Xamarin.For
ms/pull/6087/files
Preguntas &
Respuestas
One more thing
Concurso.
Al final del evento habrá un concurso. ¡No te lo
pierdas!.
Entre todos los tweets del evento relacionados
con la charla, sortearemos una licencia de:
• LiveXAML www.livexaml.com
• Aurora Controls www.auroracontrols.app
• MFractor www.mfractor.com
Thanks and …
See you soon!
Thanks also to the sponsors.
Without whom this would not have been posible.

More Related Content

What's hot

Activities, Fragments, and Events
Activities, Fragments, and EventsActivities, Fragments, and Events
Activities, Fragments, and EventsHenry Osborne
 
Intents in Android
Intents in AndroidIntents in Android
Intents in Androidma-polimi
 
Working with color and font
Working with color and fontWorking with color and font
Working with color and fontmyrajendra
 
IPT Chapter 3 Data Mapping and Exchange - Dr. J. VijiPriya
IPT Chapter 3 Data Mapping and Exchange - Dr. J. VijiPriyaIPT Chapter 3 Data Mapping and Exchange - Dr. J. VijiPriya
IPT Chapter 3 Data Mapping and Exchange - Dr. J. VijiPriyaVijiPriya Jeyamani
 
Introduction to apex code
Introduction to apex codeIntroduction to apex code
Introduction to apex codeEdwinOstos
 
Enterprise java unit-1_chapter-1
Enterprise java unit-1_chapter-1Enterprise java unit-1_chapter-1
Enterprise java unit-1_chapter-1sandeep54552
 
Packages,interfaces and exceptions
Packages,interfaces and exceptionsPackages,interfaces and exceptions
Packages,interfaces and exceptionsMavoori Soshmitha
 
Web Application Introduction
Web Application  IntroductionWeb Application  Introduction
Web Application Introductionshaojung
 
Cloud computing by Bharat Bodage
Cloud computing by Bharat BodageCloud computing by Bharat Bodage
Cloud computing by Bharat BodageBharat Bodage
 
Uml Activity Diagram
Uml Activity DiagramUml Activity Diagram
Uml Activity DiagramNiloy Rocker
 
Salesforce complete overview
Salesforce complete overviewSalesforce complete overview
Salesforce complete overviewNitesh Mishra ☁
 
Salesforce Service Cloud
Salesforce Service CloudSalesforce Service Cloud
Salesforce Service Cloudsharad soni
 
Mapa mental uml
Mapa mental umlMapa mental uml
Mapa mental umlrigo berto
 

What's hot (20)

Activities, Fragments, and Events
Activities, Fragments, and EventsActivities, Fragments, and Events
Activities, Fragments, and Events
 
Intents in Android
Intents in AndroidIntents in Android
Intents in Android
 
Rational Rose
Rational RoseRational Rose
Rational Rose
 
Working with color and font
Working with color and fontWorking with color and font
Working with color and font
 
Ooad sequence diagram lecture
Ooad sequence diagram lectureOoad sequence diagram lecture
Ooad sequence diagram lecture
 
IPT Chapter 3 Data Mapping and Exchange - Dr. J. VijiPriya
IPT Chapter 3 Data Mapping and Exchange - Dr. J. VijiPriyaIPT Chapter 3 Data Mapping and Exchange - Dr. J. VijiPriya
IPT Chapter 3 Data Mapping and Exchange - Dr. J. VijiPriya
 
Proxy Design Pattern
Proxy Design PatternProxy Design Pattern
Proxy Design Pattern
 
Introduction to apex code
Introduction to apex codeIntroduction to apex code
Introduction to apex code
 
Enterprise java unit-1_chapter-1
Enterprise java unit-1_chapter-1Enterprise java unit-1_chapter-1
Enterprise java unit-1_chapter-1
 
Introduction to .NET Framework
Introduction to .NET FrameworkIntroduction to .NET Framework
Introduction to .NET Framework
 
Packages,interfaces and exceptions
Packages,interfaces and exceptionsPackages,interfaces and exceptions
Packages,interfaces and exceptions
 
Netbeans IDE & Platform
Netbeans IDE & PlatformNetbeans IDE & Platform
Netbeans IDE & Platform
 
SQLite database in android
SQLite database in androidSQLite database in android
SQLite database in android
 
Web Application Introduction
Web Application  IntroductionWeb Application  Introduction
Web Application Introduction
 
Javascript validating form
Javascript validating formJavascript validating form
Javascript validating form
 
Cloud computing by Bharat Bodage
Cloud computing by Bharat BodageCloud computing by Bharat Bodage
Cloud computing by Bharat Bodage
 
Uml Activity Diagram
Uml Activity DiagramUml Activity Diagram
Uml Activity Diagram
 
Salesforce complete overview
Salesforce complete overviewSalesforce complete overview
Salesforce complete overview
 
Salesforce Service Cloud
Salesforce Service CloudSalesforce Service Cloud
Salesforce Service Cloud
 
Mapa mental uml
Mapa mental umlMapa mental uml
Mapa mental uml
 

Similar to DotNet 2019 | Javier Suarez - Optimizando Apps con Xamarin Forms

dotNetMálaga 2017 - Trucos y consejos rendimiento Xamarin.Forms
dotNetMálaga 2017 - Trucos y consejos rendimiento Xamarin.FormsdotNetMálaga 2017 - Trucos y consejos rendimiento Xamarin.Forms
dotNetMálaga 2017 - Trucos y consejos rendimiento Xamarin.FormsJavier Suárez Ruiz
 
Trucos y consejos rendimiento Xamarin.Forms
Trucos y consejos rendimiento Xamarin.FormsTrucos y consejos rendimiento Xamarin.Forms
Trucos y consejos rendimiento Xamarin.FormsJavier Suárez Ruiz
 
Jsf Java Server Faces
Jsf   Java Server FacesJsf   Java Server Faces
Jsf Java Server Facescok12v
 
Patrones de diseño I
Patrones de diseño IPatrones de diseño I
Patrones de diseño Ijjegonzalezf
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netAlberto Diaz Martin
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETAlberto Diaz Martin
 
Parte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLite
Parte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLiteParte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLite
Parte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLiteJuan Manuel
 
Org tutorial struts_2010
Org tutorial struts_2010Org tutorial struts_2010
Org tutorial struts_2010Omar Rios
 
Introducción a Backbone
Introducción a BackboneIntroducción a Backbone
Introducción a BackboneOscar Gensollen
 
Monkey Conf 2019: Presente y futuro de Xamarin.Forms
Monkey Conf 2019: Presente y futuro de Xamarin.FormsMonkey Conf 2019: Presente y futuro de Xamarin.Forms
Monkey Conf 2019: Presente y futuro de Xamarin.FormsJavier Suárez Ruiz
 
Aplicacion mvc entity_framework_login_membership
Aplicacion mvc entity_framework_login_membershipAplicacion mvc entity_framework_login_membership
Aplicacion mvc entity_framework_login_membershipJose B Flores P
 
Salesforce Lightning Components
Salesforce Lightning ComponentsSalesforce Lightning Components
Salesforce Lightning ComponentsDavid Carnicer
 
Rendimiento Java Script - Programador PHP
Rendimiento  Java Script - Programador PHPRendimiento  Java Script - Programador PHP
Rendimiento Java Script - Programador PHPJuan Belón Pérez
 
Seminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring InsightSeminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring InsightParadigma Digital
 
Planificando las bases de una aplicación windows phone
Planificando las bases de una aplicación windows phonePlanificando las bases de una aplicación windows phone
Planificando las bases de una aplicación windows phoneSorey García
 

Similar to DotNet 2019 | Javier Suarez - Optimizando Apps con Xamarin Forms (20)

dotNetMálaga 2017 - Trucos y consejos rendimiento Xamarin.Forms
dotNetMálaga 2017 - Trucos y consejos rendimiento Xamarin.FormsdotNetMálaga 2017 - Trucos y consejos rendimiento Xamarin.Forms
dotNetMálaga 2017 - Trucos y consejos rendimiento Xamarin.Forms
 
Trucos y consejos rendimiento Xamarin.Forms
Trucos y consejos rendimiento Xamarin.FormsTrucos y consejos rendimiento Xamarin.Forms
Trucos y consejos rendimiento Xamarin.Forms
 
Novedades Xamarin.Forms 2
Novedades Xamarin.Forms 2Novedades Xamarin.Forms 2
Novedades Xamarin.Forms 2
 
Jsf Java Server Faces
Jsf   Java Server FacesJsf   Java Server Faces
Jsf Java Server Faces
 
Patrones de diseño I
Patrones de diseño IPatrones de diseño I
Patrones de diseño I
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.net
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NET
 
Android Superstar - Buenas Prácticas
Android Superstar - Buenas PrácticasAndroid Superstar - Buenas Prácticas
Android Superstar - Buenas Prácticas
 
Parte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLite
Parte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLiteParte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLite
Parte I. Notas Rapidas (sticky notes) App w8: MVVM y SQLite
 
Org tutorial struts_2010
Org tutorial struts_2010Org tutorial struts_2010
Org tutorial struts_2010
 
Introducción a Backbone
Introducción a BackboneIntroducción a Backbone
Introducción a Backbone
 
(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0
(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0
(25.03) RUN 09 - Sesiones Desarrollo - SI 2.0
 
Monkey Conf 2019: Presente y futuro de Xamarin.Forms
Monkey Conf 2019: Presente y futuro de Xamarin.FormsMonkey Conf 2019: Presente y futuro de Xamarin.Forms
Monkey Conf 2019: Presente y futuro de Xamarin.Forms
 
Aplicacion mvc entity_framework_login_membership
Aplicacion mvc entity_framework_login_membershipAplicacion mvc entity_framework_login_membership
Aplicacion mvc entity_framework_login_membership
 
Salesforce Lightning Components
Salesforce Lightning ComponentsSalesforce Lightning Components
Salesforce Lightning Components
 
Arquitectura java web
Arquitectura java webArquitectura java web
Arquitectura java web
 
Rendimiento Java Script - Programador PHP
Rendimiento  Java Script - Programador PHPRendimiento  Java Script - Programador PHP
Rendimiento Java Script - Programador PHP
 
Seminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring InsightSeminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring Insight
 
Taller de zan php
Taller de zan phpTaller de zan php
Taller de zan php
 
Planificando las bases de una aplicación windows phone
Planificando las bases de una aplicación windows phonePlanificando las bases de una aplicación windows phone
Planificando las bases de una aplicación windows phone
 

More from Plain Concepts

R y Python con Power BI, la ciencia y el análisis de datos, juntos
R y Python con Power BI, la ciencia y el análisis de datos, juntosR y Python con Power BI, la ciencia y el análisis de datos, juntos
R y Python con Power BI, la ciencia y el análisis de datos, juntosPlain Concepts
 
Video kills the radio star: e-mail is crap and needed disruption
 Video kills the radio star: e-mail is crap and needed disruption Video kills the radio star: e-mail is crap and needed disruption
Video kills the radio star: e-mail is crap and needed disruptionPlain Concepts
 
Cómo redefinir tu organización con IA
Cómo redefinir tu organización con IACómo redefinir tu organización con IA
Cómo redefinir tu organización con IAPlain Concepts
 
Dx29: assisting genetic disease diagnosis with physician-focused AI pipelines
Dx29: assisting genetic disease diagnosis with physician-focused AI pipelinesDx29: assisting genetic disease diagnosis with physician-focused AI pipelines
Dx29: assisting genetic disease diagnosis with physician-focused AI pipelinesPlain Concepts
 
¿Qué es real? Cuando la IA intenta engañar al ojo humano
¿Qué es real? Cuando la IA intenta engañar al ojo humano¿Qué es real? Cuando la IA intenta engañar al ojo humano
¿Qué es real? Cuando la IA intenta engañar al ojo humanoPlain Concepts
 
Inteligencia artificial para detectar el cáncer de mama
Inteligencia artificial para  detectar el cáncer de mamaInteligencia artificial para  detectar el cáncer de mama
Inteligencia artificial para detectar el cáncer de mamaPlain Concepts
 
¿Está tu compañía preparada para el reto de la Inteligencia Artificial?
¿Está tu compañía preparada para el reto de la Inteligencia Artificial?¿Está tu compañía preparada para el reto de la Inteligencia Artificial?
¿Está tu compañía preparada para el reto de la Inteligencia Artificial?Plain Concepts
 
Cognitive Services en acción
Cognitive Services en acciónCognitive Services en acción
Cognitive Services en acciónPlain Concepts
 
El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...
El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...
El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...Plain Concepts
 
What if AI was your daughter?
What if AI was your daughter?What if AI was your daughter?
What if AI was your daughter?Plain Concepts
 
Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...
Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...
Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...Plain Concepts
 
Revolucionando la experiencia de cliente con Big Data e IA
Revolucionando la experiencia de cliente con Big Data e IARevolucionando la experiencia de cliente con Big Data e IA
Revolucionando la experiencia de cliente con Big Data e IAPlain Concepts
 
Recuperación de información para solicitantes de empleo
Recuperación de información para solicitantes de empleoRecuperación de información para solicitantes de empleo
Recuperación de información para solicitantes de empleoPlain Concepts
 
La nueva revolución Industrial: Inteligencia Artificial & IoT Edge
La nueva revolución Industrial: Inteligencia Artificial & IoT EdgeLa nueva revolución Industrial: Inteligencia Artificial & IoT Edge
La nueva revolución Industrial: Inteligencia Artificial & IoT EdgePlain Concepts
 
DotNet 2019 | Sherry List - Azure Cognitive Services with Native Script
DotNet 2019 | Sherry List - Azure Cognitive Services with Native ScriptDotNet 2019 | Sherry List - Azure Cognitive Services with Native Script
DotNet 2019 | Sherry List - Azure Cognitive Services with Native ScriptPlain Concepts
 
DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...
DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...
DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...Plain Concepts
 
DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...
DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...
DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...Plain Concepts
 
El camino a las Cloud Native Apps - Introduction
El camino a las Cloud Native Apps - IntroductionEl camino a las Cloud Native Apps - Introduction
El camino a las Cloud Native Apps - IntroductionPlain Concepts
 
El camino a las Cloud Native Apps - Azure AI
El camino a las Cloud Native Apps - Azure AIEl camino a las Cloud Native Apps - Azure AI
El camino a las Cloud Native Apps - Azure AIPlain Concepts
 

More from Plain Concepts (20)

R y Python con Power BI, la ciencia y el análisis de datos, juntos
R y Python con Power BI, la ciencia y el análisis de datos, juntosR y Python con Power BI, la ciencia y el análisis de datos, juntos
R y Python con Power BI, la ciencia y el análisis de datos, juntos
 
Video kills the radio star: e-mail is crap and needed disruption
 Video kills the radio star: e-mail is crap and needed disruption Video kills the radio star: e-mail is crap and needed disruption
Video kills the radio star: e-mail is crap and needed disruption
 
Cómo redefinir tu organización con IA
Cómo redefinir tu organización con IACómo redefinir tu organización con IA
Cómo redefinir tu organización con IA
 
Dx29: assisting genetic disease diagnosis with physician-focused AI pipelines
Dx29: assisting genetic disease diagnosis with physician-focused AI pipelinesDx29: assisting genetic disease diagnosis with physician-focused AI pipelines
Dx29: assisting genetic disease diagnosis with physician-focused AI pipelines
 
¿Qué es real? Cuando la IA intenta engañar al ojo humano
¿Qué es real? Cuando la IA intenta engañar al ojo humano¿Qué es real? Cuando la IA intenta engañar al ojo humano
¿Qué es real? Cuando la IA intenta engañar al ojo humano
 
Inteligencia artificial para detectar el cáncer de mama
Inteligencia artificial para  detectar el cáncer de mamaInteligencia artificial para  detectar el cáncer de mama
Inteligencia artificial para detectar el cáncer de mama
 
¿Está tu compañía preparada para el reto de la Inteligencia Artificial?
¿Está tu compañía preparada para el reto de la Inteligencia Artificial?¿Está tu compañía preparada para el reto de la Inteligencia Artificial?
¿Está tu compañía preparada para el reto de la Inteligencia Artificial?
 
Cognitive Services en acción
Cognitive Services en acciónCognitive Services en acción
Cognitive Services en acción
 
El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...
El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...
El Hogar Inteligente. De los datos de IoT a los hábitos de una familia a trav...
 
What if AI was your daughter?
What if AI was your daughter?What if AI was your daughter?
What if AI was your daughter?
 
Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...
Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...
Recomendación Basada en Contenidos con Deep Learning: Qué queríamos hacer, Qu...
 
Revolucionando la experiencia de cliente con Big Data e IA
Revolucionando la experiencia de cliente con Big Data e IARevolucionando la experiencia de cliente con Big Data e IA
Revolucionando la experiencia de cliente con Big Data e IA
 
IA Score en InfoJobs
IA Score en InfoJobsIA Score en InfoJobs
IA Score en InfoJobs
 
Recuperación de información para solicitantes de empleo
Recuperación de información para solicitantes de empleoRecuperación de información para solicitantes de empleo
Recuperación de información para solicitantes de empleo
 
La nueva revolución Industrial: Inteligencia Artificial & IoT Edge
La nueva revolución Industrial: Inteligencia Artificial & IoT EdgeLa nueva revolución Industrial: Inteligencia Artificial & IoT Edge
La nueva revolución Industrial: Inteligencia Artificial & IoT Edge
 
DotNet 2019 | Sherry List - Azure Cognitive Services with Native Script
DotNet 2019 | Sherry List - Azure Cognitive Services with Native ScriptDotNet 2019 | Sherry List - Azure Cognitive Services with Native Script
DotNet 2019 | Sherry List - Azure Cognitive Services with Native Script
 
DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...
DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...
DotNet 2019 | Quique Fernández - Potenciando VUE con TypeScript, Inversify, V...
 
DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...
DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...
DotNet 2019 | Daniela Solís y Manuel Rodrigo Cabello - IoT, una Raspberry Pi ...
 
El camino a las Cloud Native Apps - Introduction
El camino a las Cloud Native Apps - IntroductionEl camino a las Cloud Native Apps - Introduction
El camino a las Cloud Native Apps - Introduction
 
El camino a las Cloud Native Apps - Azure AI
El camino a las Cloud Native Apps - Azure AIEl camino a las Cloud Native Apps - Azure AI
El camino a las Cloud Native Apps - Azure AI
 

Recently uploaded

CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxRogerPrieto3
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 

Recently uploaded (15)

CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 

DotNet 2019 | Javier Suarez - Optimizando Apps con Xamarin Forms

  • 3. @jsuarezruiz javiersuarezruiz@hotmail.com Trabajo en Microsoft en Visual Studio para macOS. Coordinador de CartujaDotNet, comunidad .NET de Sevilla y de SVQXDG, comunidad Xamarin de Sevilla. Javier Suárez Senior Software Engineer at Microsoft
  • 4. Oops!. Problema con el rendimiento •Normalmente, el rendimiento es un punto que se suele tener en cuenta “al final” y “si es necesario”. •El objetivo de esta sesión sera que te quedes con consejos, ideas y factores a tener en cuenta para que la preocupación por el rendimiento se traslade durante todo el desarrollo.
  • 5. ¿Qué vamos a ver? 1.XAMLC 2.Bindings 3.Fast Renderers 4.Images 5.Layouts 6.CollectionView (y ListView) 7.Visual 8.Shell 9.Startup 10.Peticiones Http 11.Otros (IoC, Custom Renderers, etc)
  • 6. Suma y sigue. No hay “magia”. • Vamos a ver una sucesión de ideas y consejos relacionadas con Xamarin.Forms. de los puntos vistos os daran pequeñas mejoras en el rendimiento. No hay “líneas mágicas”, hablamos de un “suma y sigue”. • Cambio a cambio si se consiguen resultados.
  • 7. Xamarin Classic Base de código C# compartido 100% de acceso a APIs nativas Alto rendimiento iOS C# UI Windows C# UIAndroid C# UI Código compartido C# Interfaces dependientes de código nativo
  • 8. Xamarin.Forms Más código compartido. UI XAML o C# Data Binding & MVVM Abstracciones (Navegación, etc.) iOS C# UI Windows C# UIAndroid C# UI Código compartido C# Rendimiento < Xamarin.Classic UI Compartida
  • 9. A tener en cuenta... •Hay que tener en cuenta la capa de abstracción. •No se puede desarrollar absolutamente todo sin pensar en que hay “debajo”. •Hay que utilizar los controles adecuados en cada caso. •El árbol visual debe ser parte de nuestra responsabilidad. •A veces es necesario código nativo en forma de Custom Renderers o Effects. Las claves.
  • 10. Step VS 2017 15.8 VS 2019 16.0 Diferencia Primera Build 01:04.20 00:50.13 -21.95% Incremental Build (Cambios en XAML) 00:10.62 00:07.47 -29.66% Despliegue (Cambios en XAML) 00:09.03 00:04.44 -50.83% SmartHotel Reference App
  • 11. XAMLC
  • 12. Compilación de XAML Si defines la interfaz de usuario de la aplicación Xamarin.Forms con XAML tienes la opción de utilizar XamlCompilationOptions. Cuenta con dos valores: • Compile. • Acelera la carga de elementos visuales. • Reduce el tamaño del paquete. • La compilación (AOT) es más larga. • Skip. • Valor por defecto para mantener retocompatibilidad. • No hay validación en tiempo de ejecución de XAML. XAMLC
  • 13. Compilación de XAML [assembly: XamlCompilation(XamlCompilationOptions.Compile)] Detalles: • TipCalc en Android. • JIT. • Tiempo calculado con InitializeComponent() . • Tiempo medio de 5 medidas. • Oneplus 6.
  • 15. Bindings y MVVM • Binding es una características incluida en Xamarin.Forms. • Permite crear asociaciones entre una Fuente y un destino. • Permite aplicar MVVM desacoplando Modelo y Vista interponiendo una capa intermedia, la ViewModel. Propiedad pública BindableProperty Source TargetBinding OneWay TwoWay OneWayToSource
  • 16. Bindings, el funcionamiento public abstract class BindableObject : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } //... } “No enlaces cosas que se pueden establecer de forma estática” Jason Smith - Evolve 2016
  • 17. Bindings Detalles: • El sistema de Bindings es rápido, pero tiene un costo en el rendimiento. • Los errores de enlace a datos tienen impacto en el rendimiento. • En ocasiones, evitar el enlace a datos ayuda a mejorar el rendimiento (Ejemplo: listado con celda personalizada).
  • 19. Fast Renderers Hablamos de cambios realizados en Xamarin.Forms con el objetivo de reducir a mínimos el número de operaciones y cálculos a realizar para renderizar el control y gestionar su tamaño y posición. ¿Qué aporta?
  • 20. Pre Fast Renderers (Label) OnLayout(); OnLayout(); ViewRenderer MeasureAndLayout(); ViewRenderer OnLayout(); ViewElementRenderer UpdateLayout(); LabelRenderer
  • 21. Post Fast Renderers (Label) OnLayout(); OnLayout(); ViewRenderer
  • 22. Fast Renderers Detalles: • Tiempo de incialización y creación de la vista. • Android. • JIT. • Tiempo tomado de 5 medidas. • One Plus 6. • Se usan por defecto en Xamarin.Forms 4.0!
  • 24. Images Detalles: • La opción más sencilla y directa de mejorar la gestión de imágenes es usando FFImageLoading. • GlideX tiene mejor rendimiento que FFImageLoading en Android. • Gracias a IImageSourceHandler se puede personalizar que usar para la gestión de ImageSource en cada plataforma. Por ejemplo, usar FFImageLoading en iOS y GlideX en Android. • Se esta trabajando activamente en mejorar la gestión de imágenes en Xamarin.Forms. Reducción en un 15% de media en el uso de memoria en la v4.0 en comparación a v3.6.
  • 25. IImageSourceHandler Desde Xamarin.Forms 2.3.5, tenemos la interfaz IImageSourceHandler. Permite implementar ImageSource en la plataforma. Las claves. public class ImageSourceHandler : IImageSourceHandler { public Task<UIImage> LoadImageAsync( ImageSource imageSource, CancellationToken cancellationToken = new CancellationToken(), float scale = 1) { return LoadUsingFFImageLoading( imageSource, cancellationToken); } ... } ExportImageSourceHandler
  • 28. Layout • Un Layout representa un nodo en el árbol visual. • Un Layout cuenta con propiedades y eventos que permiten definer su comportamiento. • Es el responsible de gestionar la ubicación y el tamaño de nodos secundarios. • Ejemplos: StackLayout, Grid, etc.
  • 29. El ciclo de vida de un Layout La creación de un Layout en Xamarin.Forms pasa por dos fases diferentes: • Ciclo de invalidación: En el árbol visual, el ciclo de invalidación es el proceso de notificación recursivamente hacia el nodo padre. • Ciclo de Layout: Tras invalidar, se procede a la reorganización de elementos marcados como “invalidados”.
  • 31. Ciclo de Layout NoSi Por cada hijo Layout.Children
  • 32. Grid El Grid organiza los elementos hijos en filas y columnas. Permite crear estructuras complejas sin necesidad de grandes anidaciones. El tamaño de cada fila y columna es importante, y afecta al rendimiento. Hay que cuidar la utilización de celdas y filas.
  • 33. Consejos Grid El Grid organiza los elementos hijos en filas y columnas. La invalidación de una de las View hijas provoca la invalidación en cadena del árbol visual de la rejilla. <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Button Text="Button 1"/> <Label Grid.Row="1" Text="Button 2"/> </Grid>
  • 34. Consejos Grid El Grid puede organizar los elementos con tamaño proporcional a la View. El Grid ignora cualquier notificación de invalidación de sus hijos. <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Button Text="Button 1"/> <Button Grid.Row="1" Text="Button 2"/> </Grid>
  • 35. Consejos Grid El Grid puede organizar los elementos con tamaño fijo. El Grid ignora cualquier notificación de invalidación de sus hijos. <Grid> <Grid.RowDefinitions> <RowDefinition Height="150"/> <RowDefinition Height="150"/> </Grid.RowDefinitions> <Button Text="Button 1"/> <Button Grid.Row="1" Text="Button 2"/> </Grid>
  • 36. StackLayout El StackLayout organiza los elementos hijos una sóla fila o columna. Ideal para la creación sencilla y de forma rápida de forma secuencial. CUIDADO!, puede llevar a la anidación excesiva.
  • 37. Consejos StackLayout El StackLayout organiza los elementos hijos una sóla fila o columna. La invalidación de un View hijo provoca la invalidación en cadena en el árbol visual hasta el StackLayout. <StackLayout> <Button Text="Button 1"/> <Button Text="Button 2"/> </StackLayout>
  • 38. RelativeLayout El RelativeLayout organiza los elementos hijos en base a relaciones entre los diferentes elementos y el contenedor. Ideal cuando el tamaño o el posicionamiento dbe ser dinámico y adaptarse a diferentes condiciones. Rendimiento bajo. Alto consume de CPU.
  • 39. Layouts Detalles: • No uses un StackLayout para un único hijo. • No uses un Grid cuando el StackLayout hace el trabajo. • No uses varios StackLayout cuando un Grid cumple. • RelativeLayout tiene el peor rendimiento. Alto consumo de CPU. • FlexLayout, no es el vencedor en cuanto a rendimiento aunque dada su flexibilidad y rendimiento es una opción altamente recomendada. • En caso de posicionar pudiendo usar posiciones absolutas, AbsoluteLayout no tiene rival.
  • 41. ListView • Salto cualitativo con Xamarin.Forms 2.0 donde se añadieron opciones como la reutilización de celdas. • La reutilización de celdas viene definida por la propiedad ListViewCachingStrategy que cuenta con dos posibles valores: • RecycleElement • RetainElement <ListView CachingStrategy="RecycleElement"/>
  • 42. Consejos ListView • En determinadas ocasiones se requiere contenido adicional al ListView en la parte superior y/o inferior. Es recomendable utilizar las propiedades HeaderTemplate y FooterTemplate para ello. • Envolver al control ListView en un ScrollView rompe la virtualización!
  • 43. Consejos ListView <ScrollView> <StackLayout> <Label Text="Header" /> <ListView /> <Label Text="Footer" /> </StackLayout> </ScrollView> <ListView Header="Header" Footer="Footer"> <ListView.HeaderTemplate> <DataTemplate> <Label Text="{Binding .}" /> </DataTemplate> </ListView.HeaderTemplate> <ListView.FooterTemplate> <DataTemplate> <Label Text="{Binding .}" /> </DataTemplate> </ListView.FooterTemplate> </ListView>
  • 44. Consejos ListView • Se recomiendo utilizer IList<T> como ItemsSource en lugar de IEnumerable. • Si se utiliza RecycleElemement, se aumenta el rendimiento eliminando el Binding de la celda y utilizano OnBindingContextChanged. • No uses un TableView si puedes utilizar un ListView.
  • 45. • Soporta layouts Horizontal/Vertical • Soporte a multiples columnas/filas de elementos • Es como una versión moderna de ListView • No es necesario usar Cells • Se usan Views y DataTemplates • Mejora considerable en el rendimiento. https://github.com/xamarin/Xamarin.Forms/issues/3172
  • 46. CollectionView Detalles: • Media de 5 medidas. • La gestión de celdas es mucho más eficiente en CollectionView, es la clave. • El consumo de memoria es inferior al usar CollectionView con respecto a ListView. • Los tiempos necesarios para renderizado de celdas, es más óptimo en CollectionView. • Tras medir también el tiempo de arranque de la App, es también ligeramente mejor en CollectionView.
  • 48. Actualmente, muchas aplicaciones se ven a nivel estético exactamente igual en todas las plataformas. En Xamarin.Forms, para conseguir este resultado, en ocasiones hacen falta Custom Renders o efectos (código específico de plataforma) para conseguirlo. Por ese motivo, llega una nueva opción para conseguir la misma interfaz de usuario en diferentes plataformas sin necesidad de requerir tanto a Custom Renders o efectos.
  • 50. ¿Cómo usar Visual? FormsMaterial.Init(); <ContentPage Visual=“Material”> … </ContentPage> Los valores posibles de la propiedad Visual: • Default : indica que la vista debe presentarse mediante el representador predeterminado. • MatchParent : indica que la vista debe utilizar el representador mismo como su elemento primario directo. • Material : indica que la vista debe representar con un procesador de material.
  • 51. Visual Detalles: • Media de 5 medidas. • Todos los renderers de Visual son Fast Renderers. • Los renderers de Visual tienen un rendimiento general mejor que los de por defecto (salvo el Entry). • La gestión de recursos (eventos, dependencias, etc.) es mejor en los renderers en Visual, impacta en el consumo de memoria. Mejor con Visual.
  • 52.
  • 54. Shell
  • 55. Facilita la creación de la estructura de la aplicación • Un lugar común donde describir la estructura de la aplicación. • Servicio de navegación con deep linking. • Gestión de búsquedas integradas.
  • 56. • Mejor rendimiento • Facilitar crear Layouts complejos • Navegación con Flyout y pestañas • URL routed navigation, deep linking • Mejoras en la navegación, gestion de navegar atrás • Search handler • Snackbar • Bottom Sheet • Floating Action Button • Left Bar Button • Screen segues • Transiciones de páginas • Nueva API de gestos • Además de todo lo que ya era posible con Xamarin.Forms antes
  • 57. Shell Detalles: • Datos tomados de 5 medidas en Android. • Rendimiento mejor en iOS que en Android. • Shell tiene un consumo de memoria medio más bajo. • El tiempo de arranque es ligeramente mejor en iOS y a su ves ligeramente peor en Android que sin usar Shell.
  • 59. Startup • La opción compilación AOT habilita la compilación Ahead Of Time de los ensamblados. Cuando esta opción está habilitada, la sobrecarga de inicio Just-In-Time (JIT) se minimiza al precompilar ensamblados antes del tiempo de ejecución. El código nativo resultante se incluye en el paquete (APK) junto con los ensamblados sin compilar. Esto da como resultado un tiempo de inicio de la aplicación más reducido, pero a costa de tamaños APK más grandes. • A costa de tiempos de compilación más lentos, el compilador de optimización de LLVM debe crear un código compilado más pequeño y rápido.
  • 60. Startup (tiempo de arranque) Detalles: • AOT reduce casi a la mitad el tiempo de arranque!. • AOT incrementa el tamaño del paquete!. • La optimización LLVM tiene un ligero impacto en el tiempo de arranque, aunque nos ayuda a tener un paquete más ligero.
  • 63. Peticiones Http Detalles: • La reutilización de HttpClient nos ayuda a reducir drásticamente los tiempos. Esto se debe a que segregará las cosas de las que cada servidor puede depender, como las cookies o DefaultRequestHeaders. • Un error común al trabajar con HttpClient es descargar el contenido del Json en una cadena. El problema es que esto crea una cadena de todo su documento JSON innecesariamente. Impacta en el tiempo y la memoria a utilizar. Usar Streams directamente. • Usar GZIP siempre que sea posible. • Usar Xamarin's Native HttpMessageHandlers.
  • 64. Otros
  • 65. IoC Detalles: • Valor tomado de la media de 5 medidas. • Aunque con limitaciones, DependencyService de Xamarin.Forms tiene un rendimiento muy bueno. • Entre las librerías más utilizadas, TinyIoC o DryIoC entre otras destaca como una de las más rápidas.
  • 66. Custom Renderers protected override void OnElementChanged (ElementChangedEventArgs<NativeListView> e) { base.OnElementChanged (e); if (Control == null) { // Instantiate the native control } if (e.OldElement != null) { // Unsubscribe from event handlers and cleanup any resources } if (e.NewElement != null) { // Configure the control and subscribe to event handlers } }
  • 67. Compresión de Layout • Layout Compression permite indicar elementos con anidamiento innecesario y optar a no crear layout. Con esta opción habilitada los layouts se optimizarán en tiempo de compilación permitiendo obtener un mejor rendimiento en tiempo de ejecución. • Layout Compression elimina layouts encargados de gestionar aspectos como gestos, etc. Si tu Layout utiliza las propiedades Rotation, Scale, TranslationX o TranslationY (entre otras), no es un buen candidato. <Grid CompressedLayout.IsHeadless="true"> </Grid>
  • 68. Compresión de Layout <ContentView ...> <StackLayout> <StackLayout ...> <AbsoluteLayout ...> <Button ... /> <Image ... /> <Image ... /> <BoxView ... /> <Label ... /> <Button ... /> </AbsoluteLayout> </StackLayout> <Label ... /> </StackLayout> </ContentView> 17 views 14 views (8 utilizando Fast Renderers)
  • 69. Recuerda! • Muchos de los puntos vistos os daran pequeñas mejoras en el rendimiento. No hay “líneas mágicas”, hablamos de un “suma y sigue”. • Cambio a cambio si se consiguen resultados.
  • 70. Código https://github.com/jsuarezruiz/xamarin-forms-perf-playground • Detalles: • Más de una docena de ejemplos. • Varios Profilers para medir tiempo de arranque, memoria consumida, jerarquía de elementos, etc. • Xamarin.Forms incluye Profiler en v4.2 https://github.com/x amarin/Xamarin.For ms/pull/6087/files
  • 72. One more thing Concurso. Al final del evento habrá un concurso. ¡No te lo pierdas!. Entre todos los tweets del evento relacionados con la charla, sortearemos una licencia de: • LiveXAML www.livexaml.com • Aurora Controls www.auroracontrols.app • MFractor www.mfractor.com
  • 73. Thanks and … See you soon! Thanks also to the sponsors. Without whom this would not have been posible.

Editor's Notes

  1. Both
  2. https://www.youtube.com/watch?v=RZvdql3Ev0E
  3. Miguel
  4. https://www.youtube.com/watch?v=RZvdql3Ev0E
  5. Miguel
  6. Miguel ->James