Evaluación En Cortocircuito Y Velocidad De Gambas


Objetivo: 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.

Ayortano
Objetivo: 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

Objetivo: 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

Objetivo: 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

Perfil MP  
Objetivo: 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

Perfil MP  
Objetivo: 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


Página 1 de 1


  
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

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.6214s (PHP: -63% SQL: 163%)
Consultas SQL: 45 - Debug off - GZIP Activado