Mostrando entradas con la etiqueta .net. Mostrar todas las entradas
Mostrando entradas con la etiqueta .net. Mostrar todas las entradas

lunes 17 de marzo de 2008

StringBuilder vs. concatenación de String

Trabajando para la última versión de GeneXus (Rocha) me tocó escribir algunas sentencias SQL. Como hasta ahora hice siempre, empecé declarando una variable string con la sentencia y a esta le concatenaba los parámetros que fuera necesario*.
Pero en determinado momento, Milano me recomendó como buena práctica, utilizar StringBuilder para concatenar strings, en lugar de la fácil y práctica forma de concatenación con el '+'.

Pero por qué? "se supone que es mas eficiente" me dijo... "no es que esa concatenación vaya a significar una demora en el proceso, pero es una práctica recomendable utilizar StringBuilder".

No es que desconfíe de el :) pero me interesó hacer una prueba para ver que tan eficiente era, y los resultados de esa prueba me motivaron este post asique acá están.

Primero voy a mostrar la prueba que hice. El main es el siguiente:

 

string text = "First text";
int i = 100000;

DateTime start;
DateTime end;
TimeSpan duration;

start = DateTime.Now;
InsertString(text, i);
end = DateTime.Now;
duration = end - start;
Console.WriteLine(string.Format("InsertString took {0}:{1} seconds", duration.Seconds, duration.Milliseconds));

start = DateTime.Now;
InsertStringBuilder(text, i);
end = DateTime.Now;
duration = end - start;
Console.WriteLine(string.Format("InsertStringBuilder took {0}:{1} seconds", duration.Seconds, duration.Milliseconds));

Como verán, simplemente tomo el tiempo antes y después de cada llamada y luego imprimo la diferencia en segundos y milisegundos para saber cuanto demoró cada función. La funciones InsertString e InsertStringBuilder son muy básicas pero también las pegaré acá:

private static void InsertString(string text, int i)
{
for (int j = 0; i >= j; j++)
text += " new text";
}

private static void InsertStringBuilder(string text, int i)
{
StringBuilder builder = new StringBuilder(text);
for (int j = 0; i >= j; j++)
builder.Append(" new text");
}

Dije que eran básicas :)
Pues bien, ahora el resultado...


StringBuilder


Bastante increible no? por lo menos a mi me llamó enormemente la atención, más de 20 segundos contra menos de 1!. Obviamente esta diferencia se hace muy notoria por la cantidad de iteraciones que tiene la concatenación, si solo es concatenar un string con otro una única vez, posiblemente no valga la pena utilizar el StringBuilder.


*Nota: si los parámetros son ingresados por el usuario final de la aplicación esta no es una buena práctica. Podemos llegar a ser víctimas de SQL Injection.

Seguir Leyendo

sábado 1 de marzo de 2008

Arquitectura de Software (hasta donde ir?)

Hace un tiempo me encontraba con amigos y ex compañeros de clase, (son los mismos) discutiendo sobre hasta donde es necesario meter cabeza en la arquitectura de un producto de software. Todos recordábamos los clásicos e imprácticos "obligatorios" de facultad donde justamente se calificaba si uno había aprendido patrones y daba la sensación, que cuanto mas compleja la arquitectura, mejor te iba a ir.

El tema es que ahora, con experiencia laboral en nuestras espaldas, no parecía tan obvia como antes la necesidad de un diseño detallado de la aplicación a desarrollar. Antes de proseguir quiero aclarar que el nivel alcoholico de la noche era bueno muy bueno, o sea, después de arreglar el hambre en el mundo, el calentamiento global y admirar el iPhone de Mateo (y tirarlo al suelo), es que nos pusimos a payar del asunto.

Por eso, y siguiendo con la discución, es que quiero compartir una experiencia de vida que me tocó vivir (?) hace poco. Resulta que allá por el 2002 empezamos con Carlitos un sistema para un cliente. En ese momento recién habíamos salido de facultad, por lo que metimos cabeza en el diseño y arquitectura como locos (nunca mas volví a invertir tanto tiempo en eso). Que la capa de presentación, que solo se comunica con la capa de lógica, que se comunica con la de persistencia que es la única que accede a la base, que la capa de "dominio" con objetos que pasaban la información entre las capas... en fin.

Pero resulta que la semana pasada tuve que separar esa aplicación que era un gran exe porque iba a necesita lógica de esa aplicación para hacer otra. Eso me llevó a tomar la desición de crear una dll con la lógica y que el exe mantuviera solo la capa de presntación (pantallas). Y acá es donde viene la "magia", después de tomar la desición, en 2 hrs tuve la aplicación andando nuevamente, esta vez accediendo a la lógica encapsulada en la dll. No sé, tal vez no sea nada del otro mundo, pero quedé muy contento con el resultado y sé que se debió a dos cosas fundamentales. Un excelente diseño inicial y un desarrollo acorde a este, que aunque parezca obvio, es algo que a veces tienden a alejarse.

En definitiva, contestando la pregunta incial... hasta donde ir? lo mas posible, y cuando ya estés podrido de diseñar y quieras empezar a picar código, dedícale un poco mas al diseño.

Salud Gastón!

Seguir Leyendo

domingo 23 de diciembre de 2007

Ejemplo de WCF con Membership Provider

Este post es una simple traduccion del post orginal en ingles, pero me parecio importante traducirlo ya que ultimamente me encontrado con gente que prefiere las paginas y foros en espanol,ya sea por "orgullo" o por desconocimiento del idioma ingles, asique aqui esta.

El ejemplo esta basado en un lab del libro "Learning WCF" de Michele Leroux Bustamante, consta de una aplicacion web donde se "hostean" los servicios WCF, un proyecto que implementa los servicios y un cliente WinForms que los consume. Antes que nada hay que bajarse el "Apendice A" del mencionado libro, el cual explica como crear la base de datos y manjearse con los certificados para preparar el ambiente.

Una vez este todo eso pronto pueden proceder a probar el ejemplo. Aca esta la aplicacion web y aca la solucion con el cliente y la libreria que implementa los servicios (abra todos los projectos en una msima solucion).

Dado que los mensajes que se reciben desde el cliente cuando no se puede validar el usuario no son muy claros, es que agregue una pagina aspx para probar que el membership provider haya sido bien configurado antes de probar el cliente WCF. Tambien le agregue un web service asmx con el mismo objetivo.

Una ultima cosa, estos proyectos fueron creados con VS2005 pero tambien deberian funcionar sin cambios con VS2008 (aunque no lo he probado aun)

Seguir Leyendo

jueves 13 de septiembre de 2007

Seguridad en WCF


No hay caso, cuando uno no sabe tiene que leer y leer. Hace un tiempo que vengo trabajando en la implementacion de seguridad para el addin de WCF pero habia varias cosas que no me cerraban. Muchas opciones en la vuelta, que si Message o Transport o Both o MessageWithTransportCredential.


Creo que uno (yo seguro) tiende a querer ver algo funcionando ASAP y se pone a mater dedo cuanto antes. A mi me pasaba de leer algo y pensar "ta! es asi" y al probarlo no funcionaba (obviamente). En seguida uno intenta utilizar cierta logica. En mi caso pensaba, "bueno, esto es una evolucion de Remoting asique debe venir por este lado" o como cuando estaba trabajando con el binding WSHttp decia "si en WSE era asi, no debe ser tan ditinto". Para que? para que pasarme esas horas buscando la solucion, cuando esta no estaba en la pantalla sino en el libro abierto que tenia al lado?


Recuerdo el primer libro tecnico que me compre "por necesidad", lease, no requerido para ninguna materia de facultad. Se llamaba "XML for Dummies" (no es algo de lo que este orgulloso), pero en ese entonces me pasaba exactamente lo mismo. Veia un pedazo de codigo y largaba lo que estaba leyendo para codificarlo a ver que pasaba. Al volver al libro, frustrado por no haber pasado nada, leia en el parrafo siguiente la respuesta a mis plegarias.


Habre aprendido esta vez?
"Dificil que el chancho chifle"

Seguir Leyendo