SlideShare ist ein Scribd-Unternehmen logo
1 von 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

Weitere ähnliche Inhalte

Was ist angesagt?

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
 

Was ist angesagt? (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
 

Ähnlich wie 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
 

Ähnlich wie 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
 
EC2 Avanzado
EC2 AvanzadoEC2 Avanzado
EC2 Avanzado
 
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
 
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
 

Mehr von 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
 

Mehr von 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
 

Kürzlich hochgeladen

Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaarkananubis
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..RobertoGumucio2
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 

Kürzlich hochgeladen (20)

Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en mina
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 

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.