SlideShare a Scribd company logo
1 of 40
2020
Netcoreconf
Memoria, .NET y
rendimiento
Eduard Tomàs
Random Key Presser & Beer Crafter
@eiximenis
#netcoreconf
Sponsors
#netcoreconf
¿Quien soy yo?
• Principal Tech Lead @
PlainConcepts BCN
• Padre orgulloso
• Bebedor de cerveza
• Picateclas a mucha honra
• Microsoft MVP desde 2012
#netcoreconf
Memoria, .NET y Rendimiento
• La (gran) mayoría de cosas que voy a
contar no las vas a necesitar nunca…
• … Hasta que un día quizá las
necesites.
#netcoreconf
• Hazlo o no lo hagas….
• … Pero si lo haces…
• ¡MÍDELO!
#netcoreconf
#netcoreconf
Código sin
reservas de
memoria (no alloc
code)
#netcoreconf
¿Por qué?
¿Es costoso reservar
memoria manejada?
NO!!!!
#netcoreconf
¿Por qué?
Lo costoso es
liberarla
(El GC)
#netcoreconf
¿Por qué?
• Reservar más memoria implica más GC
• GC implica pausas
• Código con menos GC…
• Será más fluído (no necesariamente más rápido)
• Funcionará major en entornos restringidos (batería, cpu,…)
#netcoreconf
¿Como funciona el GC?
• Objetos se guardan en el managed heap (memoria manejada)
• Reservar un objeto es rapidísimo
• Garbage Collector libera objetos no usados del managed heap
#netcoreconf
GC – Generaciones
• GC no libera todo el heap de golpe. Lo divide en Generaciones (3):
Gen 0 Gen 1 Gen 2
Objetos de corta vida
(Variables locales)
Objetos de vida media Objetos de larga duración
(P. ej. Singletons)
• Los objetos de Gen 0 que están vivos cuando se ejecuta el GC se mueven a
Gen 1
• Los objetos de Gen 1 que están vivos cuando se ejecuta el GC se mueven a
Gen 2
• Los objetos de Gen 2 que están vivos cuando se ejecuta el GC se quedan en
Gen 2
#netcoreconf
GC - LOH
• Heap especial para objetos “grandes” > 85Kb
• No compactado (puede provocar OutOfMemoryException)
• Solo se liberan en una “liberación completa” del GC
#netcoreconf
GC - ¿Cuando se ejecucta?
• Bueeeenoooo…..
• Cuando no se puede reservar memoria
• Cuando se ha reservado X memoria desde la última ejecución
• Forzado (métodos de System.GC o por Profiler API)
• Aplicación se mueve al background
• No está garantizado cuando se ejecuta el GC
#netcoreconf
GC – Tips / Tricks
• GC pausa la aplicación mientras se está ejecutando…
• … excepto en nuevas versiones de .NET (Background GC)
• IDisposable ayuda al GC (limpia referencias)
• Finalizers => Objeto va a la “finalizer queue” y suma una generación
• Usar WeakReference
• Una referencia que no es tenida en cuenta por el GC
#netcoreconf
Back to Basics: Value Type vs Reference Type
Reference Type
class
Almacenados en el heap
La variable es una referencia
al objeto en el heap
Semántica de referencia
(asignación y paso implica
copiar la referencia, no el
valor)
Value Type
struct
Almacenados en la pila
La variable es el propio
valor
Semántica de valor
(asignación y paso implica
copiar el valor)
#netcoreconf
Reservas de memoria “ocultas”
• params reserva un array con los parámetros
• closures
• LINQ reserva Enumerable
• Iteradores
• async/await
• …
#netcoreconf
Demo: Hidden Allocs
#netcoreconf
Value Types o Reference Types
Value Types: Barato reservarlos, caro
pasarlos
Reference Types: Caro reservarlos,
barato pasarlos
¿Podemos tener objetos que sea barato
reservarlos Y barato pasarlos?
#netcoreconf
Value Types o Reference Types
Con C# 7.2 SÍ
Podemos tener Value Types con
semántica de referencias
#netcoreconf
Value Types con semántica de referencia
• Permite usar value objects como si fuesen reference objects
• Paso por referencia siempre 
• Tiene limitaciones (para evitar refs valores inexistentes)
• ref return
• Devuelve un value object por referencia. Modificar la referencia es modificar
el value object original
• ref local
• Una variable que es una referencia a un tipo por valor
• ref local para guardar el resultado de ref return
• Ojo con var! Usar ref var!
#netcoreconf
Value Types con semántica de referencia
• ref readonly return
• Permite devolver un value type por referencia
• No permite al receptor, modificar el objeto
• El compilador hace copias automáticamente para asegurar readonly
• Parámetros in
• Permite pasar un value type por referencia (al igual que ref y out)
• El método no puede modificar el parámetro
• readonly struct
• ValueType que el compilador sabe (y obliga a) que es inmutable
• Elimina las copias defensivas del compilador para params in / ref readonly
#netcoreconf
Parámetros in
• Se aplican a la firma del método
• Con structs no readonly puede implicar copias defensivas
• Se puede aplicar a la llamada. Si NO se aplica se le da permiso al
compilador para efectuar copias en algunos casos
• Sobrecarga con paso por valor (preferida)
• Existe una conversión implícita del tipo del argumento al tipo del parámetro
• …
#netcoreconf
Value Types con semántica de referencia
Todos esos añadidos son puros del
lenguaje C#
El CLR no se ha modificado
#netcoreconf
Consejos
• Evita usar in para structs mutables
• Copias defensivas pueden perjudicar el rendimiento
• Usa ref readonly return siempre que puedas
• Usa in para “readonly structs” de tamaño superior a IntPtr.Size
#netcoreconf
Demo: ref return & ref local
#netcoreconf
Demo: in & readonly struct
#netcoreconf
ref struct
• Una ref struct es una estructura que solo puede ser almacenada en
la pila, nunca en el heap
• NO puede ser miembro de un objeto que esté en el heap.
• NO puede ser miembro de una clase porque estas siempre están en el heap
• NO puede ser miembro de una estructura porque estas están en el heap si a
su vez son miembros de un objeto que esté en el heap (p. ej. una clase)
• Solo se pueden usar como parámetros, valores retorno o variables
locales
#netcoreconf
Gestión “unificada” de memoria
Span<T>
#netcoreconf
Span<T>
• Unifica el trabajo con “bloques contíguos de memoria”
• Arrays, strings, stackallock, memoria no manejada,…
• Ofrece una API similar a la de un Array
• Segura a nivel de tipos (elementos de tipo T)
• Soporta slicing
• Crear un nuevo Span<T>, subsección de uno existente…
• … sin reservar nueva memoria!
#netcoreconf
Span<T> - Dos implementaciones
• Implementación portable
• No require soporte adicional
• Paquete NuGet (netstandard 1.1)
• Netfx 4.5
• Sin ser lento… no es tan rápido como un array
#netcoreconf
Span<T> - Dos implementaciones
• Implementación “rápida”
• Requiere soporte del framework
• .NET Core 2.1 o superior
• Optimizaciones JIT propias
• Rendimiento equiparable al de un array
#netcoreconf
Demo: Span<T>
#netcoreconf
stackalloc
• Fuerza el almacenamiento en la pila para aquellos elementos que,
habitualmente, se almacenarían en el heap
• Disminuye la presión sobre el GC
• Liberación determinista (al final del método)
#netcoreconf
Demo: Stackalloc
#netcoreconf
Gestión “unificada” de memoria
Memory<T>
#netcoreconf
Memory<T>
• Span<T> es “ref struct” => Solo se almacena en la pila
• Variables en métodos async son realmente campos estáticos de una
clase generada por el compilador (incompatible con ref struct)
async Task DoSomethingAsync(Span<byte> buffer) {
buffer[0] = 0;
await Something();
buffer[0] = 1;
}
async Task DoSomethingAsync(Memory<byte> buffer) {
buffer.Span[0] = 0;
await Something();
buffer.Span[0] = 1;
}
#netcoreconf
Conclusiones
• Todo eso son micro-optimizaciones
• Úsalas solo si las necesitas. Probablemente puedas optimizar muchas
cosas antes.
• Mide siempre los resultados
• ¡Recuerda que las mediciones dependen de TU máquina y de TU
framework exacto!
• No des nada por supuesto.
#netcoreconf
Sponsors
Más información:
info@netcoreconf.com
@Netcoreconf
Visítanos en:
netcoreconf.com

More Related Content

What's hot

Introduccion a Elastic Beanstalk AWS Roadshow Bogota Mexico
Introduccion a Elastic Beanstalk   AWS Roadshow Bogota MexicoIntroduccion a Elastic Beanstalk   AWS Roadshow Bogota Mexico
Introduccion a Elastic Beanstalk AWS Roadshow Bogota MexicoHermann Pais
 
Java Dev Day 2019 No kuberneteen por convivir
Java Dev Day 2019  No kuberneteen por convivirJava Dev Day 2019  No kuberneteen por convivir
Java Dev Day 2019 No kuberneteen por convivirDomingo Suarez Torres
 
Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2Ricard Clau
 
[El comercio]php zend framework (speech)
[El comercio]php zend framework (speech)[El comercio]php zend framework (speech)
[El comercio]php zend framework (speech)Ernesto Anaya
 
ASP.NET 5 en Linux y Mac OS X: herramientas e integración
ASP.NET 5 en Linux y Mac OS X: herramientas e integraciónASP.NET 5 en Linux y Mac OS X: herramientas e integración
ASP.NET 5 en Linux y Mac OS X: herramientas e integraciónLuis Ruiz Pavón
 
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...Restorando
 
.Net Core Real time App on My Rasperry PI - Codemotion 2017 talk
.Net Core Real time App on My Rasperry PI - Codemotion 2017 talk.Net Core Real time App on My Rasperry PI - Codemotion 2017 talk
.Net Core Real time App on My Rasperry PI - Codemotion 2017 talkCarlos Landeras Martínez
 
Infrastructure as Code
Infrastructure as CodeInfrastructure as Code
Infrastructure as CodeAngel Nuñez
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.Paradigma Digital
 
Introducción a GraalVM Native para aplicaciones JVM
Introducción a GraalVM Native para aplicaciones JVMIntroducción a GraalVM Native para aplicaciones JVM
Introducción a GraalVM Native para aplicaciones JVMVíctor Leonel Orozco López
 
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez.NET UY Meetup
 
¡Introducción a Cypress! - Globant Tech Insiders: Automatización de Pruebas
¡Introducción a Cypress! - Globant Tech Insiders: Automatización de Pruebas¡Introducción a Cypress! - Globant Tech Insiders: Automatización de Pruebas
¡Introducción a Cypress! - Globant Tech Insiders: Automatización de PruebasGlobant
 
Kubernetes - Container Orchestration, Deployment and Scaling
Kubernetes - Container Orchestration, Deployment and ScalingKubernetes - Container Orchestration, Deployment and Scaling
Kubernetes - Container Orchestration, Deployment and ScalingAngel Nuñez
 
Despliegue de aplicaciones Java con Docker y Kubernetes
Despliegue de aplicaciones Java con Docker y KubernetesDespliegue de aplicaciones Java con Docker y Kubernetes
Despliegue de aplicaciones Java con Docker y KubernetesJaime Perera Merino
 
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Micael Gallego
 
Docker como la máxima expresión de Devops - WISIT 2015
Docker como la máxima expresión de Devops - WISIT 2015Docker como la máxima expresión de Devops - WISIT 2015
Docker como la máxima expresión de Devops - WISIT 2015Gustavo Andres Brey
 

What's hot (20)

Introduccion a Elastic Beanstalk AWS Roadshow Bogota Mexico
Introduccion a Elastic Beanstalk   AWS Roadshow Bogota MexicoIntroduccion a Elastic Beanstalk   AWS Roadshow Bogota Mexico
Introduccion a Elastic Beanstalk AWS Roadshow Bogota Mexico
 
Java Dev Day 2019 No kuberneteen por convivir
Java Dev Day 2019  No kuberneteen por convivirJava Dev Day 2019  No kuberneteen por convivir
Java Dev Day 2019 No kuberneteen por convivir
 
Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2
 
[El comercio]php zend framework (speech)
[El comercio]php zend framework (speech)[El comercio]php zend framework (speech)
[El comercio]php zend framework (speech)
 
ONE Xperience at Facultat d'Informàtica de Barcelona
ONE Xperience at Facultat d'Informàtica de BarcelonaONE Xperience at Facultat d'Informàtica de Barcelona
ONE Xperience at Facultat d'Informàtica de Barcelona
 
ASP.NET 5 en Linux y Mac OS X: herramientas e integración
ASP.NET 5 en Linux y Mac OS X: herramientas e integraciónASP.NET 5 en Linux y Mac OS X: herramientas e integración
ASP.NET 5 en Linux y Mac OS X: herramientas e integración
 
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
Kubernetes technical overview and our experience at Restorando :: Buenos Aire...
 
.Net Core Real time App on My Rasperry PI - Codemotion 2017 talk
.Net Core Real time App on My Rasperry PI - Codemotion 2017 talk.Net Core Real time App on My Rasperry PI - Codemotion 2017 talk
.Net Core Real time App on My Rasperry PI - Codemotion 2017 talk
 
Infrastructure as Code
Infrastructure as CodeInfrastructure as Code
Infrastructure as Code
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.
 
Introducción a GraalVM Native para aplicaciones JVM
Introducción a GraalVM Native para aplicaciones JVMIntroducción a GraalVM Native para aplicaciones JVM
Introducción a GraalVM Native para aplicaciones JVM
 
Web Day Devops - Plain Concepts
Web Day Devops - Plain ConceptsWeb Day Devops - Plain Concepts
Web Day Devops - Plain Concepts
 
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
 
¡Introducción a Cypress! - Globant Tech Insiders: Automatización de Pruebas
¡Introducción a Cypress! - Globant Tech Insiders: Automatización de Pruebas¡Introducción a Cypress! - Globant Tech Insiders: Automatización de Pruebas
¡Introducción a Cypress! - Globant Tech Insiders: Automatización de Pruebas
 
Kubernetes - Container Orchestration, Deployment and Scaling
Kubernetes - Container Orchestration, Deployment and ScalingKubernetes - Container Orchestration, Deployment and Scaling
Kubernetes - Container Orchestration, Deployment and Scaling
 
Despliegue de aplicaciones Java con Docker y Kubernetes
Despliegue de aplicaciones Java con Docker y KubernetesDespliegue de aplicaciones Java con Docker y Kubernetes
Despliegue de aplicaciones Java con Docker y Kubernetes
 
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
Herramientas y plugins para el desarrollo de aplicaciones cloud native para K...
 
Docker como la máxima expresión de Devops - WISIT 2015
Docker como la máxima expresión de Devops - WISIT 2015Docker como la máxima expresión de Devops - WISIT 2015
Docker como la máxima expresión de Devops - WISIT 2015
 
Overview atlas (1)
Overview atlas (1)Overview atlas (1)
Overview atlas (1)
 
Spring boot et. al. para el impaciente
Spring boot et. al. para el impacienteSpring boot et. al. para el impaciente
Spring boot et. al. para el impaciente
 

Similar to Cómo optimizar el rendimiento de .NET evitando reservas de memoria

Docker_K8S_lecciones_netcoreconf_2022.pdf
Docker_K8S_lecciones_netcoreconf_2022.pdfDocker_K8S_lecciones_netcoreconf_2022.pdf
Docker_K8S_lecciones_netcoreconf_2022.pdfLeonardo Micheloni
 
Caracteristicas de C Sharp
Caracteristicas de C SharpCaracteristicas de C Sharp
Caracteristicas de C SharpEdgardo Martinez
 
Swift migration. the true history
Swift migration. the true historySwift migration. the true history
Swift migration. the true historyidealistacreamcode
 
Git: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativoGit: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativoAprende Git
 
Introduccion_a_Python_000000000000000.pdf
Introduccion_a_Python_000000000000000.pdfIntroduccion_a_Python_000000000000000.pdf
Introduccion_a_Python_000000000000000.pdfFranciaMascarell
 
Slides taller de exploiting Navaja Negra 4ed
Slides taller de exploiting Navaja Negra 4edSlides taller de exploiting Navaja Negra 4ed
Slides taller de exploiting Navaja Negra 4edIgnacio Sorribas
 
Understanding Advanced Buffer Overflow
Understanding Advanced Buffer OverflowUnderstanding Advanced Buffer Overflow
Understanding Advanced Buffer OverflowConferencias FIST
 
AWS Summits América Latina 2015 EC2 Avanzado
AWS Summits América Latina 2015 EC2 AvanzadoAWS Summits América Latina 2015 EC2 Avanzado
AWS Summits América Latina 2015 EC2 AvanzadoAmazon Web Services LATAM
 
Fundamentos de Microsoft .NET y C#
Fundamentos de Microsoft .NET y C#Fundamentos de Microsoft .NET y C#
Fundamentos de Microsoft .NET y C#Humberto Jaimes
 
Desymfony - Servicios
Desymfony  - ServiciosDesymfony  - Servicios
Desymfony - ServiciosRicard Clau
 

Similar to Cómo optimizar el rendimiento de .NET evitando reservas de memoria (20)

tutorial de c++
tutorial de c++tutorial de c++
tutorial de c++
 
Tutorial C++
Tutorial C++Tutorial C++
Tutorial C++
 
Docker_K8S_lecciones_netcoreconf_2022.pdf
Docker_K8S_lecciones_netcoreconf_2022.pdfDocker_K8S_lecciones_netcoreconf_2022.pdf
Docker_K8S_lecciones_netcoreconf_2022.pdf
 
Gestión Remota de Equipos con Python
Gestión Remota de Equipos con PythonGestión Remota de Equipos con Python
Gestión Remota de Equipos con Python
 
Caracteristicas de C Sharp
Caracteristicas de C SharpCaracteristicas de C Sharp
Caracteristicas de C Sharp
 
Python
PythonPython
Python
 
Swift migration. the true history
Swift migration. the true historySwift migration. the true history
Swift migration. the true history
 
Git: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativoGit: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativo
 
Introduccion_a_Python_000000000000000.pdf
Introduccion_a_Python_000000000000000.pdfIntroduccion_a_Python_000000000000000.pdf
Introduccion_a_Python_000000000000000.pdf
 
Slides taller de exploiting Navaja Negra 4ed
Slides taller de exploiting Navaja Negra 4edSlides taller de exploiting Navaja Negra 4ed
Slides taller de exploiting Navaja Negra 4ed
 
Scala desde c# y JavaScript
Scala desde c# y JavaScriptScala desde c# y JavaScript
Scala desde c# y JavaScript
 
Rendimiento extremo en php
Rendimiento extremo en phpRendimiento extremo en php
Rendimiento extremo en php
 
Desarrollo desoftware
Desarrollo desoftwareDesarrollo desoftware
Desarrollo desoftware
 
P-S2.pptx
P-S2.pptxP-S2.pptx
P-S2.pptx
 
Understanding Advanced Buffer Overflow
Understanding Advanced Buffer OverflowUnderstanding Advanced Buffer Overflow
Understanding Advanced Buffer Overflow
 
AWS Summits América Latina 2015 EC2 Avanzado
AWS Summits América Latina 2015 EC2 AvanzadoAWS Summits América Latina 2015 EC2 Avanzado
AWS Summits América Latina 2015 EC2 Avanzado
 
EC2 Avanzado
EC2 AvanzadoEC2 Avanzado
EC2 Avanzado
 
Fundamentos de Microsoft .NET y C#
Fundamentos de Microsoft .NET y C#Fundamentos de Microsoft .NET y C#
Fundamentos de Microsoft .NET y C#
 
Desymfony - Servicios
Desymfony  - ServiciosDesymfony  - Servicios
Desymfony - Servicios
 
C++ Meetup Madrid
C++ Meetup MadridC++ Meetup Madrid
C++ Meetup Madrid
 

More from Eduard Tomàs

KCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDAKCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDAEduard Tomàs
 
C#9 - Más C# que nunca
C#9 - Más C# que nuncaC#9 - Más C# que nunca
C#9 - Más C# que nuncaEduard Tomàs
 
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDACollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDAEduard Tomàs
 
Codemotion 2015 - Bienvenido de nuevo c++
Codemotion 2015 - Bienvenido de nuevo c++Codemotion 2015 - Bienvenido de nuevo c++
Codemotion 2015 - Bienvenido de nuevo c++Eduard Tomàs
 
El "peor" lenguaje del mundo
El "peor" lenguaje del mundoEl "peor" lenguaje del mundo
El "peor" lenguaje del mundoEduard Tomàs
 
Containerize a netcore application with aks
 Containerize a netcore application with aks Containerize a netcore application with aks
Containerize a netcore application with aksEduard Tomàs
 
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)Eduard Tomàs
 
Aplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramosAplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramosEduard Tomàs
 
Serverless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDbServerless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDbEduard Tomàs
 
Docker y todo eso... más o menos
Docker y todo eso... más o menosDocker y todo eso... más o menos
Docker y todo eso... más o menosEduard Tomàs
 
Microservices: Yes or not?
Microservices: Yes or not?Microservices: Yes or not?
Microservices: Yes or not?Eduard Tomàs
 
React native - Unleash the power of your device
React native - Unleash the power of your deviceReact native - Unleash the power of your device
React native - Unleash the power of your deviceEduard Tomàs
 
JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)Eduard Tomàs
 
Asp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep DiveAsp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep DiveEduard Tomàs
 
React native - t3chfest 2016
React native - t3chfest 2016React native - t3chfest 2016
React native - t3chfest 2016Eduard Tomàs
 
React, Flux y React native
React, Flux y React nativeReact, Flux y React native
React, Flux y React nativeEduard Tomàs
 
Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6Eduard Tomàs
 
JavaScript - HTML5 - IndexedDb
JavaScript - HTML5 - IndexedDbJavaScript - HTML5 - IndexedDb
JavaScript - HTML5 - IndexedDbEduard Tomàs
 

More from Eduard Tomàs (20)

KCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDAKCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
 
C#9 - Más C# que nunca
C#9 - Más C# que nuncaC#9 - Más C# que nunca
C#9 - Más C# que nunca
 
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDACollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
 
Codemotion 2015 - Bienvenido de nuevo c++
Codemotion 2015 - Bienvenido de nuevo c++Codemotion 2015 - Bienvenido de nuevo c++
Codemotion 2015 - Bienvenido de nuevo c++
 
El "peor" lenguaje del mundo
El "peor" lenguaje del mundoEl "peor" lenguaje del mundo
El "peor" lenguaje del mundo
 
Containerize a netcore application with aks
 Containerize a netcore application with aks Containerize a netcore application with aks
Containerize a netcore application with aks
 
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
 
Aplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramosAplicaciones de consola fáciles? Más quisieramos
Aplicaciones de consola fáciles? Más quisieramos
 
Serverless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDbServerless with Azure Functions and CosmosDb
Serverless with Azure Functions and CosmosDb
 
Docker y todo eso... más o menos
Docker y todo eso... más o menosDocker y todo eso... más o menos
Docker y todo eso... más o menos
 
Microservices: Yes or not?
Microservices: Yes or not?Microservices: Yes or not?
Microservices: Yes or not?
 
ASP.NET MVC Core
ASP.NET MVC CoreASP.NET MVC Core
ASP.NET MVC Core
 
Azure functions
Azure functionsAzure functions
Azure functions
 
React native - Unleash the power of your device
React native - Unleash the power of your deviceReact native - Unleash the power of your device
React native - Unleash the power of your device
 
JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)
 
Asp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep DiveAsp.Net Core 1.0 Deep Dive
Asp.Net Core 1.0 Deep Dive
 
React native - t3chfest 2016
React native - t3chfest 2016React native - t3chfest 2016
React native - t3chfest 2016
 
React, Flux y React native
React, Flux y React nativeReact, Flux y React native
React, Flux y React native
 
Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6Novedades de ASP.NET MVC6
Novedades de ASP.NET MVC6
 
JavaScript - HTML5 - IndexedDb
JavaScript - HTML5 - IndexedDbJavaScript - HTML5 - IndexedDb
JavaScript - HTML5 - IndexedDb
 

Recently uploaded

ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaYeimys Ch
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024u20211198540
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointValerioIvanDePazLoja
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
PROYECCIÓN DE VISTAS planos de vistas y mas
PROYECCIÓN DE VISTAS planos de vistas y masPROYECCIÓN DE VISTAS planos de vistas y mas
PROYECCIÓN DE VISTAS planos de vistas y maslida630411
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxtjcesar1
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxCarolina Bujaico
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDAVIDROBERTOGALLEGOS
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nóminacuellosameidy
 
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxPLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxhasbleidit
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosAlbanyMartinez7
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfcristianrb0324
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersIván López Martín
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdfBetianaJuarez1
 
Viguetas Pretensadas en concreto armado
Viguetas Pretensadas  en concreto armadoViguetas Pretensadas  en concreto armado
Viguetas Pretensadas en concreto armadob7fwtwtfxf
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)JuanStevenTrujilloCh
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar24roberto21
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfKarinaCambero3
 

Recently uploaded (20)

ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guiaORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
ORIENTACIONES DE INFORMÁTICA-2024.pdf-guia
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
 
Trabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power PointTrabajando con Formasy Smart art en power Point
Trabajando con Formasy Smart art en power Point
 
El camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVPEl camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVP
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
PROYECCIÓN DE VISTAS planos de vistas y mas
PROYECCIÓN DE VISTAS planos de vistas y masPROYECCIÓN DE VISTAS planos de vistas y mas
PROYECCIÓN DE VISTAS planos de vistas y mas
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
 
Clasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptxClasificación de Conjuntos de Datos Desequilibrados.pptx
Clasificación de Conjuntos de Datos Desequilibrados.pptx
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptx
 
Nomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de NóminaNomisam: Base de Datos para Gestión de Nómina
Nomisam: Base de Datos para Gestión de Nómina
 
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxPLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos Juridicos
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdf
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
 
Viguetas Pretensadas en concreto armado
Viguetas Pretensadas  en concreto armadoViguetas Pretensadas  en concreto armado
Viguetas Pretensadas en concreto armado
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdf
 

Cómo optimizar el rendimiento de .NET evitando reservas de memoria

  • 1. 2020 Netcoreconf Memoria, .NET y rendimiento Eduard Tomàs Random Key Presser & Beer Crafter @eiximenis
  • 3. #netcoreconf ¿Quien soy yo? • Principal Tech Lead @ PlainConcepts BCN • Padre orgulloso • Bebedor de cerveza • Picateclas a mucha honra • Microsoft MVP desde 2012
  • 4. #netcoreconf Memoria, .NET y Rendimiento • La (gran) mayoría de cosas que voy a contar no las vas a necesitar nunca… • … Hasta que un día quizá las necesites.
  • 5. #netcoreconf • Hazlo o no lo hagas…. • … Pero si lo haces… • ¡MÍDELO!
  • 8. #netcoreconf ¿Por qué? ¿Es costoso reservar memoria manejada? NO!!!!
  • 9. #netcoreconf ¿Por qué? Lo costoso es liberarla (El GC)
  • 10. #netcoreconf ¿Por qué? • Reservar más memoria implica más GC • GC implica pausas • Código con menos GC… • Será más fluído (no necesariamente más rápido) • Funcionará major en entornos restringidos (batería, cpu,…)
  • 11. #netcoreconf ¿Como funciona el GC? • Objetos se guardan en el managed heap (memoria manejada) • Reservar un objeto es rapidísimo • Garbage Collector libera objetos no usados del managed heap
  • 12. #netcoreconf GC – Generaciones • GC no libera todo el heap de golpe. Lo divide en Generaciones (3): Gen 0 Gen 1 Gen 2 Objetos de corta vida (Variables locales) Objetos de vida media Objetos de larga duración (P. ej. Singletons) • Los objetos de Gen 0 que están vivos cuando se ejecuta el GC se mueven a Gen 1 • Los objetos de Gen 1 que están vivos cuando se ejecuta el GC se mueven a Gen 2 • Los objetos de Gen 2 que están vivos cuando se ejecuta el GC se quedan en Gen 2
  • 13. #netcoreconf GC - LOH • Heap especial para objetos “grandes” > 85Kb • No compactado (puede provocar OutOfMemoryException) • Solo se liberan en una “liberación completa” del GC
  • 14. #netcoreconf GC - ¿Cuando se ejecucta? • Bueeeenoooo….. • Cuando no se puede reservar memoria • Cuando se ha reservado X memoria desde la última ejecución • Forzado (métodos de System.GC o por Profiler API) • Aplicación se mueve al background • No está garantizado cuando se ejecuta el GC
  • 15. #netcoreconf GC – Tips / Tricks • GC pausa la aplicación mientras se está ejecutando… • … excepto en nuevas versiones de .NET (Background GC) • IDisposable ayuda al GC (limpia referencias) • Finalizers => Objeto va a la “finalizer queue” y suma una generación • Usar WeakReference • Una referencia que no es tenida en cuenta por el GC
  • 16. #netcoreconf Back to Basics: Value Type vs Reference Type Reference Type class Almacenados en el heap La variable es una referencia al objeto en el heap Semántica de referencia (asignación y paso implica copiar la referencia, no el valor) Value Type struct Almacenados en la pila La variable es el propio valor Semántica de valor (asignación y paso implica copiar el valor)
  • 17. #netcoreconf Reservas de memoria “ocultas” • params reserva un array con los parámetros • closures • LINQ reserva Enumerable • Iteradores • async/await • …
  • 19. #netcoreconf Value Types o Reference Types Value Types: Barato reservarlos, caro pasarlos Reference Types: Caro reservarlos, barato pasarlos ¿Podemos tener objetos que sea barato reservarlos Y barato pasarlos?
  • 20. #netcoreconf Value Types o Reference Types Con C# 7.2 SÍ Podemos tener Value Types con semántica de referencias
  • 21. #netcoreconf Value Types con semántica de referencia • Permite usar value objects como si fuesen reference objects • Paso por referencia siempre  • Tiene limitaciones (para evitar refs valores inexistentes) • ref return • Devuelve un value object por referencia. Modificar la referencia es modificar el value object original • ref local • Una variable que es una referencia a un tipo por valor • ref local para guardar el resultado de ref return • Ojo con var! Usar ref var!
  • 22. #netcoreconf Value Types con semántica de referencia • ref readonly return • Permite devolver un value type por referencia • No permite al receptor, modificar el objeto • El compilador hace copias automáticamente para asegurar readonly • Parámetros in • Permite pasar un value type por referencia (al igual que ref y out) • El método no puede modificar el parámetro • readonly struct • ValueType que el compilador sabe (y obliga a) que es inmutable • Elimina las copias defensivas del compilador para params in / ref readonly
  • 23. #netcoreconf Parámetros in • Se aplican a la firma del método • Con structs no readonly puede implicar copias defensivas • Se puede aplicar a la llamada. Si NO se aplica se le da permiso al compilador para efectuar copias en algunos casos • Sobrecarga con paso por valor (preferida) • Existe una conversión implícita del tipo del argumento al tipo del parámetro • …
  • 24. #netcoreconf Value Types con semántica de referencia Todos esos añadidos son puros del lenguaje C# El CLR no se ha modificado
  • 25. #netcoreconf Consejos • Evita usar in para structs mutables • Copias defensivas pueden perjudicar el rendimiento • Usa ref readonly return siempre que puedas • Usa in para “readonly structs” de tamaño superior a IntPtr.Size
  • 27. #netcoreconf Demo: in & readonly struct
  • 28. #netcoreconf ref struct • Una ref struct es una estructura que solo puede ser almacenada en la pila, nunca en el heap • NO puede ser miembro de un objeto que esté en el heap. • NO puede ser miembro de una clase porque estas siempre están en el heap • NO puede ser miembro de una estructura porque estas están en el heap si a su vez son miembros de un objeto que esté en el heap (p. ej. una clase) • Solo se pueden usar como parámetros, valores retorno o variables locales
  • 30. #netcoreconf Span<T> • Unifica el trabajo con “bloques contíguos de memoria” • Arrays, strings, stackallock, memoria no manejada,… • Ofrece una API similar a la de un Array • Segura a nivel de tipos (elementos de tipo T) • Soporta slicing • Crear un nuevo Span<T>, subsección de uno existente… • … sin reservar nueva memoria!
  • 31. #netcoreconf Span<T> - Dos implementaciones • Implementación portable • No require soporte adicional • Paquete NuGet (netstandard 1.1) • Netfx 4.5 • Sin ser lento… no es tan rápido como un array
  • 32. #netcoreconf Span<T> - Dos implementaciones • Implementación “rápida” • Requiere soporte del framework • .NET Core 2.1 o superior • Optimizaciones JIT propias • Rendimiento equiparable al de un array
  • 34. #netcoreconf stackalloc • Fuerza el almacenamiento en la pila para aquellos elementos que, habitualmente, se almacenarían en el heap • Disminuye la presión sobre el GC • Liberación determinista (al final del método)
  • 37. #netcoreconf Memory<T> • Span<T> es “ref struct” => Solo se almacena en la pila • Variables en métodos async son realmente campos estáticos de una clase generada por el compilador (incompatible con ref struct) async Task DoSomethingAsync(Span<byte> buffer) { buffer[0] = 0; await Something(); buffer[0] = 1; } async Task DoSomethingAsync(Memory<byte> buffer) { buffer.Span[0] = 0; await Something(); buffer.Span[0] = 1; }
  • 38. #netcoreconf Conclusiones • Todo eso son micro-optimizaciones • Úsalas solo si las necesitas. Probablemente puedas optimizar muchas cosas antes. • Mide siempre los resultados • ¡Recuerda que las mediciones dependen de TU máquina y de TU framework exacto! • No des nada por supuesto.