Veo que esa charla de Daniel quedó en la memoria de muchos... En la mía también! Si mal no recuerdo -ojalá Daniel lea este thread y me corrija-, lo que Daniel mostró fue mirando la actividad propia del procesador. Utilizando "With" queda en el registro de memoria del procesador la dirección del objeto/variable (la charla era para VB6), disminuyendo la cantidad de peticiones de direcciones de memoria que el procesador debía realizar si no se utilizaba. Es decir, si tenemos un código como el ejemplo de Diego, sin with el procesador pide 3 veces la dirección de memoria del objeto test. Con with, la pide sólo una, y no la suelta del registro del procesador hasta el end with. En la misma charla, y bajo el mismo concepto (ahorrar procesador), nos mostró por qué era mejor utilizar algunos tipos de datos más genéricos (recuerdo Integer) en lugar de otros más específicos (recuerdo Byte), aún cuando sepamos que los valores serán pequeños, por cómo éstos debían ser "recortados" ya que utilizaban medio registro del procesador, y a éste se le hacía más complicado obtenerlos. Ojo! Esto no aplicaba a la estructura de campos de una BD. Saludos, Ana.
_____ De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Diego Jancic Enviado el: Viernes 07 de Septiembre de 2007 19:11 Para: [email protected] Asunto: [puntonet] Proclama para salvar instancias Uhh.. esa me la dejaste dificil, la verdad que no uso VB. Hasta hace unos minutos creia que era solamente por ser ordenado, pero me genere un ejemplo en C# y uno en VB.NET para ver el IL generado El codigo era esto: C# VB.NET Codigo SIN Compilar Class1 test = new Class1(); test.a = "hola"; test.b = "mundo"; test.c = "feliz"; Dim Test As Class1 = New Class1 With Test .a = "hola" .b = "mundo" .c = "feliz" End With IL (codigo compilado) .maxstack 2 .locals init ( [0] class Test_VB_CS.Class1 test) L_0000: newobj instance void Test_VB_CS.Class1::.ctor() L_0005: stloc.0 L_0006: ldloc.0 L_0007: ldstr "hola" L_000c: stfld string Test_VB_CS.Class1::a L_0011: ldloc.0 L_0012: ldstr "mundo" L_0017: stfld string Test_VB_CS.Class1::b L_001c: ldloc.0 L_001d: ldstr "feliz" L_0022: stfld string Test_VB_CS.Class1::c L_0027: ret .maxstack 2 .locals init ( [0] class Test_VB.Class1 Test, [1] class Test_VB.Class1 VB$t_ref$L0) L_0000: newobj instance void Test_VB.Class1::.ctor() L_0005: stloc.0 L_0006: ldloc.0 L_0007: stloc.1 L_0008: ldloc.1 L_0009: ldstr "hola" L_000e: stfld string Test_VB.Class1::a L_0013: ldloc.1 L_0014: ldstr "mundo" L_0019: stfld string Test_VB.Class1::b L_001e: ldloc.1 L_001f: ldstr "feliz" L_0024: stfld string Test_VB.Class1::c L_0029: ldnull L_002a: stloc.1 L_002b: ret Y si el codigo de VB.NET lo traducimos a C# (o incluso vemos una descompilación en VB.NET), vemos esto: Class1 Test = new Class1(); Class1 VB$t_ref$L0 = Test; VB$t_ref$L0.a = "hola"; VB$t_ref$L0.b = "mundo"; VB$t_ref$L0.c = "feliz"; VB$t_ref$L0 = null; Bueno, vaya uno a saber lo que intentaron hacer ahí. Pero mis conclusiones son: 1- Si podes usar C#, usalo porque genera menos IL, por lo tanto es mas rapido :-) 2- Si vas a usar VB.NET te conviene usar (a nivel performance), algo asi: Variable.Text = asdasd Variable.Tag = 0 Variable.Hola = Mundo etc 3- El WITH conviene usarlo cuando obtener la variable requiere procesamiento. En cambio de usar esto: (Supongamos que el metodo ObtenerVariable devuelva siempre una referencia a la misma instancia, porque sino el codigo no tiene el mismo comportamiento) ObtenerVariable().Text = asdasd ObtenerVariable().Tag = 0 ObtenerVariable().Hola = Mundo etc U otra forma de hacer lo mismo (Que es como se haria en C# o C++): Variable = ObtenerVariable() Variable.Text = asdasd Variable.Tag = 0 Variable.Hola = Mundo etc Saludos!, Diego _____ From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Gastón Dorigo Sent: Viernes, 07 de Septiembre de 2007 06:36 p.m. To: [email protected] Subject: [puntonet] Proclama para salvar instancias Muy buena la idea de la proclama, me sumo con una consulta: Hace un tiempo en un evento en el Hotel Sheraton, Daniel Seara explicaba las ventajas de utilizar el bloque with / end with, por ejemplo WITH textbox1 .text = texto .tag = 0 . etc END WITH La consulta es porque no recuerdo ni puedo deducir cuales son los motivos que validan esta afirmación, si alguien recuerda o me puede ayudar a deducir una justificación válida se lo agradecería porque varios alumnos me lo han consultado y todavía estoy buscando una respuesta razonable. Saludos. _____ De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Damián Herrera Enviado el: Viernes, 07 de Septiembre de 2007 06:01 p.m. Para: [email protected] Asunto: [puntonet] Proclama para salvar instancias Ya que estamos, yo también me sumo a la proclama!!! Por todos los medios posibles evitar la siguiente estructura de código: Try ... ... Catch ex As Exception Throw(ex) ... End try Esto es lo mismo que no capturar el error, en lugar de hacer esto no hagan nada! Se van a ahorrar tiempo de procesamiento :) Si no, asegurense de hacer los rollbacks o cancelar la operación antes de la línea "Throw(ex)". Feliz fin de semana! Damián Herrera _____ From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Diego Jancic Sent: Friday, September 07, 2007 5:44 PM To: [email protected] Subject: [puntonet] Proclama para salvar instancias Hola gente!, Estoy modificando un programa que hicieron muchos programadores (incluidos semi-seniors y seniors), y me canse de ver algunas cosas sin sentido. Por ese motivo estoy realizando esta proclama general, para que si alguien lo hace, lo evite la proxima vez. ;-) Cuando tenemos un codigo de este estilo: MiClase instancia = new MiClase(); instancia = UnServicio.ObtenerDesdeBD( ); En ese caso, se estan creando 2 objetos cuando se deberia crear uno Fijense que la 2da linea sobrescribe completamente la primera!! Y para agravar el problema, el metodo UnServicio.ObtenerDesdeBD hace algo con el parecido pero llamando a la base de datos o a un WS o a donde sea. Entonces se termina creando una instancia por capa, cuando en realidad se necesita una sola (o ninguna si el metodo devuelve null) Espero haberles ahorrado aunque sea 1 segundo de procesamiento en todo el tiempo de vida de su aplicación. Bueno, esto fue una pequeña contribución a todos ellos que por costumbre repiten estas cosas desde hace mucho tiempo (ojo, hace bastante yo tambien lo hacia!). Saludos y Happy Programming!, Diego __________ Información de NOD32, revisión 2513 (20070907) __________ Este mensaje ha sido analizado con NOD32 antivirus system http://www.nod32.com
