¿Alguna vez te has preguntado por qué tu código se vuelve cada vez más lento a medida que crecen los datos? La respuesta está en el coste computacional de tus algoritmos. Si alguna vez te has frustrado al ver que tu código no escala bien, este artículo es para ti. Hoy te explicaré cómo los aparentemente inofensivos bucles anidados pueden convertir tu proyecto en una «tortuga» y, lo más importante, veremos cómo optimizarlos para transformar tu rendimiento.
Sigue leyendo Optimiza tu código: Cómo mejorar el rendimiento de bucles anidadosEtiqueta: programación
Librerías HTTP en .Net
He de decir que nunca me había planteado usar librerías HTTP para hacer una llamada REST desde mí código en C#. Simplemente uso HttpClient y luego serializo el resultado con Newtonsoft, nada del otro mundo. La autenticación, parámetros o cuerpo de la petición, la monto a mano y listos. Hasta el día de hoy (en el momento de escribir esta entrada para el blog) no conocía librerías para hacer esto, ni interés que tenia. Pero entonces, me ha llamado un compañero de trabajo para ver si podía darle mi opinión sobre un tema y mientras mirábamos el código, he visto una clase llamada RestClient. -Eso no es estándar de .Net- he pensado, así que me he puesto a indagar. Y lo que he visto me ha parecido interesante y por eso he indagado un poco y me he puesto ha hacer unas pruebas básicas, para ver si compensa o no usar librerías para realizar llamadas HTTP.
Sigue leyendo Librerías HTTP en .NetPasar un número variable de parámetros en C#
Estamos en verano, y esto se nota en el blog. El ritmo de actualización ha bajado mucho, es cierto, pero también es cierto que genero mas contenido además del publicado en el blog, cosa que hace un año no era así. Aprovecho pues para recordarte que puedes seguir mi contenido en Twitch y en Youtube.
Dicho esto, vamos con una pequeña píldora. El otro día aprendí una nueva característica, posiblemente muy básica, de primero se podría decir, pero que yo por el motivo que fuese, desconocía. Y es la posibilidad de pasar un numero variable de parámetros a una función en C#.
Es posible que tengamos la necesidad de pasar un número variable de parámetros a una función, para ello podríamos pasar un listado o un array, pero también tenemos la palabra reservada params.
Para mostrar esta funcionalidad, un pequeño ejemplo. En este trozo de código tenemos una función recibe un número indeterminado de palabras, que simplemente junta para mostrar una frase:
static void Main(string[] args)
{
MuestraFrase("Hola", "esto", "es", "una", "prueba");
}
public static void MuestraFrase(params string[] palabras)
{
Console.WriteLine(string.Join(" ", palabras));
Console.ReadLine();
}
El resultado de ejecutar el código anterior será:
Para poder usar esta funcionalidad solo hay que tener en cuenta un par de cosas:
- Se pueden pasar parámetros adicionales a la función, pero el declarado como params ha de ser el último dentro del método.
- El parámetro declarado como params ha de ser un array unidimensional
Hasta aquí esta pequeña píldora de verano, espero que te sea de utilidad.
¡Nos leemos!
Yield Return: que es y como usarlo
Hoy os quiero traer una pequeña píldora con el uso de yield return en C#. Usándolo, estamos indicando que el método es un iterador. Pero, ¿esto que quiere decir?
Veámoslo con un ejemplo, leed el siguiente código. Sin conocer el uso de yield return, a priori el método DameInts() sería imposible, ya que entraríamos en un bucle infinito. Tomate un segundo y ejecútalo, a ver que pasa.
using System;
using System.Collections.Generic;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var resultado = DameInts();
foreach (var a in resultado)
Console.WriteLine(a);
}
public static IEnumerable<int> DameInts()
{
int i = 0;
while (true)
{
yield return ++i;
System.Threading.Thread.Sleep(1000);
}
}
}
}
Sigue leyendo Yield Return: que es y como usarlo Patrones cloud: patrón Retry
Que es un patrón en desarrollo de software
Antes de ver el patrón retry, vamos a empezar por el principio, vamos a ver que es un patrón. En el desarrollo de software, es de los más normal encontrarnos con problemas y/o retos que son recurrentes y que siempre están ahí. Retos que son agnósticos al lenguaje de programación que utilices, incluso si estas haciendo algo con alguna herramienta low code, te encontraras con estas casuísticas. ¿Cómo accedemos a la base de datos? ¿Cómo tratamos los errores? ¿Cómo muevo millones de registros en el menor tiempo posible?, etc. ¿no te ha pasado nunca que tienes un error, un problema, algo que no sabes como hacer, lo buscas en StackOverflow, y hay cientos de respuestas? Seguro que creías que eso solo te había pasado a ti, pero no, en software, todos nos encontramos con las mismas problemáticas.
Un patrón es un diseño que nos permite «atacar» a una casuística concreta, no es mas que una forma concreta de resolver un problema. Puedes profundizar mucho más en la definición desde la página de Wikipedia.
Los patrones cloud, por lo tanto, serán soluciones a problemas concretos que se dan en los entornos y desarrollos pensados para la nube. Recuerda, son soluciones agnosticas a la tecnologia que uses. Yo para mis ejemplos voy a usar Azure y C#, pero podrías aplicar el patrón a AWS y Java, por ejemplo, o picar el código en Python, es indiferente.
Sigue leyendo Patrones cloud: patrón RetryComo hacer pruebas de carga HTTP con Vegeta
Una de las tareas que mas he de realizar últimamente es la creación de Api web (REST) para comunicar distintos componentes entre ellos. Cuando los desarrollamos, hacemos algunos test unitarios y de integración, pero mas haya del rendimiento que ofrece la Api en nuestros entornos de desarrollo, no estábamos probando como rinden en situaciones de estrés. Y eso me tenía mosca. El otro día, vi por Twitter a alguien que mencionaba una herramienta llamada Vegeta, que sirve precisamente para hacer pruebas de carga HTTP.
Con esta necesidad que tenía y este nombre de proyecto, no hay duda que los astros se alinearon en ese Tweet.
Vamos a ver en esta entrada como usar Vegeta para realizar pruebas de carga de nuestra API. «It’s over 9000!»
Sigue leyendo Como hacer pruebas de carga HTTP con VegetaEl reto de la empresa de mapas: Bajar un fichero de 2GB y procesarlo lo más rápido posible
Hace algún tiempo me tope por casualidad con un reto que proponen en la sección de reclutamiento en una conocida empresa que se dedica a la visualización de datos sobre mapas (no quiero poner el nombre directamente, que el reto sigue activo en su web y no quiero fastidiarles si alguien «Googlea» para ver como hacerlo). El reto consiste en obtener un fichero .csv de aproximadamente 2GB de Internet y hacer algunos cálculos sobre los datos que contiene, lo más rápidamente posible. Esta claro que el ejercicio es para ver como los nuevos aspirantes plantean una posible solución, ya que el resultado, entre otras cosas, dependerá mucho de la velocidad de la red en la que se ejecute el programa. Recordemos, el requisito es ir lo más rápido posible y hay que descargar un fichero de 2GB.
El stack tecnológico de esta empresa es Python, pero como a mí lo que me gusta es C#, acepté el reto, pero en mi lenguaje.
Al final conseguí unos tiempos de ~30 segundos en una red de 600 megas (que según comente con los creadores del reto en Twitter, no esta nada mal) con un programa de consola en .Net Core, vamos a ver como lo enfoqué.
Sigue leyendo El reto de la empresa de mapas: Bajar un fichero de 2GB y procesarlo lo más rápido posibleCrear un programa de consola asíncrono con C#
Hace ya bastante tiempo que no publico una píldora de código. Aquí va una: como crear un programa de consola en C# que pueda hacer llamadas asíncronas (async – await).
Puede serte útil en algún momento.
Actualización: Como bien comenta @snavarropino en los comentarios, a partir de la versión 7.1 de C# se incluyen main asíncronos, por lo que no sería necesario usar este «atajo».
¡Nos leemos!