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

Responder a