Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Evaluación En Cortocircuito Y Velocidad De Gambas
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Evaluación En Cortocircuito Y Velocidad De Gambas 
 
Para los que no lo sepan, la implementación de gambas de la evaluación en cortocircuito es limitada y requiere una sintaxis especial:

IF 11 >  9 AND IF "a" > "b" THEN.
...

IF "z" < "Z" OR IF 3 < 5 THEN
...
 


Como se puede ver en el ejemplo resulta necesario volver a escribir la palabra reservada IF con cada expresión booleana que se quiera evaluar. Pero también hay restricciones adicionales:

  • Sólo es posible utilizar evaluación en cortocircuito al utilizar la estructura condicional IF

    DIM bExpression AS Boolean

      'Esto no se evalua en cortocircuito en Gambas
      bExpression = "z" < "Z" OR 3 < 5

      'Y esto es sintácticamente incorrecto
      bExpression = "z" < "Z" OR IF 3 < 5
     

  •   No es posible mezclar conjunción y disyunción lógica (AND y OR) en una misma expresión

    'Esto simplemente no es posible, el compilador lo rechaza
    IF ("z" < "Z" OR IF 3 < 5)  OR IF (11 >  9 AND IF "a" > "b")  THEN
     



Esta es una de las pocas falencias de gambas con respecto a otros lenguajes. Estas limitaciones me molestan bastante por eso quise hacer esta prueba:

  • Escribir en gambas una clase estática que tuviera dos métodos AND y OR que permitieran realizar evaluaciones lógicas en cortocircuito.
  • Probar el impacto que el uso de estos métodos tendría con respecto a la evaluación en cortocircuito por medio de "AND IF" y "OR IF"


Parece obvio que el uso de las clases AND y OR escritas en gambas debería tener un costo computacional mayor que el uso de "AND IF" y "OR IF". Bueno, pongamos esta teoría a prueba.

La clase es esta:
' gambas class file
' Clase: Bool

STATIC PUBLIC FUNCTION AND(...) AS Boolean
DIM acTest, Test AS Boolean = TRUE
  FOR EACH Test IN Param
    acTest = acTest AND Test
    IF NOT acTest THEN BREAK
  NEXT
  RETURN acTest
END

STATIC PUBLIC FUNCTION OR(...) AS Boolean
DIM acTest, Test AS Boolean
  FOR EACH Test IN Param
    acTest = acTest OR Test
    IF acTest THEN BREAK
  NEXT
  RETURN acTest
END
 


Para realizar pruebas escribí el siguiente código en un módulo:
' gambas module file
' Módulo: Test
PUBLIC SUB Main()
DIM tcount AS Date

  tcount = Now
  PRINT "Probando Bool.OR"
  PRINT Bool.OR(11 < 7, 7 < 9, 5 < 9)
  PRINT Bool.OR(7 < 9, 11 < 7, 5 < 9)
  PRINT Bool.OR(7 < 9, 5 < 9, 11 < 7)
  PRINT Bool.OR(17 < 9, 15 < 9, 11 < 7)
  tcount = Now - tcount
  PRINT Format(tcount, "hh:mm:ss:uu")

  PRINT

  tcount = Now
  PRINT "Probando Bool.AND"
  PRINT Bool.AND(11 < 7, 7 < 9, 5 < 9)
  PRINT Bool.AND(7 < 9, 11 < 7, 5 < 9)
  PRINT Bool.AND(7 < 9, 5 < 9, 11 < 7)
  PRINT Bool.AND(7 < 9, 5 < 9, 11 < 17)
  tcount = Now - tcount
  PRINT Format(tcount, "hh:mm:ss:uu")

  PRINT

  tcount = Now
  PRINT "Probando Bool.AND"
  PRINT Bool.AND(1 < 2, 2 < 3, 3 < 4, 4 < 5, 5 < 6, 6 < 7, 7 < 8, 8 < 9, 9 < 10)
  tcount = Now - tcount
  PRINT Format(tcount, "hh:mm:ss:uu")

  PRINT

  tcount = Now
  PRINT "Probando evaluación en cortocircuito de Gambas: AND IF"
  IF 1 < 2 AND IF 2 < 3 AND IF 3 < 4 AND IF 4 < 5 AND IF 5 < 6 AND IF 6 < 7 AND IF 7 < 8 AND IF 8 < 9 AND IF 9 < 10 THEN
    PRINT TRUE
  ELSE
    PRINT FALSE
  ENDIF
  tcount = Now - tcount
  PRINT Format(tcount, "hh:mm:ss:uu")

  PRINT

  tcount = Now
  PRINT "Probando Bool.OR"
  PRINT Bool.OR(1 < 2, 2 < 3, 3 < 4, 4 < 5, 5 < 6, 6 < 7, 7 < 8, 8 < 9, 9 < 10)
  tcount = Now - tcount
  PRINT Format(tcount, "hh:mm:ss:uu")

  PRINT
  tcount = Now
  PRINT "Probando evaluación en cortocircuito de Gambas: OR IF"
  IF 1 < 2 OR IF 2 < 3 OR IF 3 < 4 OR IF 4 < 5 OR IF 5 < 6 OR IF 6 < 7 OR IF 7 < 8 OR IF 8 < 9 OR IF 9 < 10 THEN
    PRINT TRUE
  ELSE
    PRINT FALSE
  ENDIF
  tcount = Now - tcount
  PRINT Format(tcount, "hh:mm:ss:uu")

END
 


Finalmente, estos fueron los resultados:

Probando Bool.OR
True
True
True
False
00:00:00:.003

Probando Bool.AND
False
False
False
True
00:00:00:.000

Probando Bool.AND
True
00:00:00:.000

Probando evaluación en cortocircuito de Gambas: AND IF
True
00:00:00:.000

Probando Bool.OR
True
00:00:00:.000

Probando evaluación en cortocircuito de Gambas: OR IF
True
00:00:00:.000

Como verán la única diferencia de rendimiento apreciable se da en la primera ejecución y es de sólo 3 milésimas de segundo.

Cómo no estoy seguro del resultado les pido a quienes estén interesados que repitan esta prueba en sus máquinas. Si los números les dan como a mí, entonces ya tenemos una forma de poder usar evaluación en cortocircuito en gambas sin ninguna limitación, y si no es así, al menos podremos buscar las razones que justifiquen tanto los resultados favorables como los desfavorables.
 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Evaluación En Cortocircuito Y Velocidad De Gambas 
 
Lo probé 10 veces para estar seguro, y me da...

Probando Bool.OR
True
True
True
False
00:00:00:000

Probando Bool.AND
False
False
False
True
00:00:00:000

Probando Bool.AND
True
00:00:00:000

Probando evaluación en cortocircuito de Gambas: AND IF
True
00:00:00:000

Probando Bool.OR
True
00:00:00:000

Probando evaluación en cortocircuito de Gambas: OR IF
True
00:00:00:000
 



 
 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Evaluación En Cortocircuito Y Velocidad De Gambas 
 
Aunque no tengo idea de lo que significa evaluación en cortocircuito(Y eso que soy electricista), hice las pruebas en  mi pc
Pentium4 -1.6 ghz ,1 giga de ram.  
so Ubuntu 10.04
gambas 2.19
Mis resultados:
Probando Bool.OR
True
True
True
False
00:00:00:.000

Probando Bool.AND
False
False
False
True
00:00:00:.000

Probando Bool.AND
True
00:00:00:.000

Probando evaluación en cortocircuito de Gambas: AND IF
True
00:00:00:.000

Probando Bool.OR
True
00:00:00:.000

Probando evaluación en cortocircuito de Gambas: OR IF
True
00:00:00:.000

Saludos
 




===================
Migrando desde visual basic, el Gambas de Ms
Mi blog gambero
 
Dani26 - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Evaluación En Cortocircuito Y Velocidad De Gambas 
 
AMD 64 - 2x3000GHz (en 32bits)


En gambas 2.21.1
Probando Bool.OR
True
True
True
False
00:00:00:.000 <--- En la primera ejecución = 00:00:00:.004

Probando Bool.AND
False
False
False
True
00:00:00:.000

Probando Bool.AND
True
00:00:00:.001 <--- A veces .001, otras .000

Probando evaluación en cortocircuito de Gambas: AND IF
True
00:00:00:.000

Probando Bool.OR
True
00:00:00:.000

Probando evaluación en cortocircuito de Gambas: OR IF
True
00:00:00:.000


En Gambas3 siempre es .000 para todos los test. A simple vista parece extremadamente más rápida su ejecución.

Buena argumentación sobre la materia. Y por cierto, interesante el uso de la clase Param para número variable de argumentos!
¿Para cuándo la sobrecarga de métodos?  

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Evaluación En Cortocircuito Y Velocidad De Gambas 
 
Dani26 escribió: [Ver mensaje]
Aunque no tengo idea de lo que significa evaluación en cortocircuito(Y eso que soy electricista), hice las pruebas en  mi pc
Pentium4 -1.6 ghz ,1 giga de ram.  
Saludos

es exactamente lo mismo

corto-circuito se acorta el circuito

si evaluamos lo siguiente
1= 3 and 2=2
como  1=3 es falso  por lógica binaria todo es falso por lo tanto no es necesario evaluar 2=2  o sea se hace corto circuito y se ahorran microsegundos
evaluación en corto circuito solo es una manera de ponerle un nombre raro
 



 
codificador - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Evaluación En Cortocircuito Y Velocidad De Gambas 
 
Citar:

como 1=3 es falso por lógica binaria todo es falso por lo tanto no es necesario evaluar 2=2 o sea se hace corto circuito y se ahorran microsegundos


Bien, entonces en la medición que intentamos hay un claro problema de escala incorrecta. De todos modos, la cuestión es si la diferencia es significativa o despreciable. Si la evaluación en corto-circuito es fácil de usar, por más que el beneficio muchas veces pueda ser inapreciable, resulta factible de usarla, de lo contrario es un plomo.

Citar:

evaluación en corto circuito solo es una manera de ponerle un nombre raro


No, no es un nombre raro. Un nombre raro (y largo) sería algo como: evaluación perezosa en estructuras de control condicionales y expresiones booleanas
 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Velocidad De Carga De SQlite Marcelo Bases de Datos 26 Miercoles, 14 Septiembre 2011, 22:29 Ver último mensaje
Marcelo
No hay nuevos mensajes Ejemplo De Clases: Gambas Y Viajar A La Ve... jsbsan Aplicaciones/Fragmentos de Código 0 Sabado, 02 Junio 2012, 13:28 Ver último mensaje
jsbsan
No hay nuevos mensajes Evaluación Rendimiento Mysql alessandri Programación en otros lenguajes 0 Viernes, 23 Diciembre 2016, 00:30 Ver último mensaje
alessandri
No hay nuevos mensajes Arrays Y Test De Velocidad Shell General 0 Miercoles, 13 May 2020, 14:21 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron