Página 1 de 1

Pregunta para satisfacer mi calenturienta mente...

Publicado: Mié Feb 11, 2009 2:46 am
por Manu Exposito
Qué es más rápido...
esto:
if( uiIndex > 0 && uiIndex <= hDS->uiColCount )
o esto:
if( !( uiIndex < 1 || uiIndex > hDS->uiColCount ) )
?????????????
Se supone que las dos son equivalentes en cuanto al resultado, pero cual
es más rápido en la ejecución?

Pregunta para satisfacer mi calenturienta mente...

Publicado: Mié Feb 11, 2009 3:11 pm
por jose.luis
Hola Manu,
Yo creo que la segunda forma
> if( !( uiIndex < 1 || uiIndex > hDS->uiColCount ) )
por que entiendo que
1. primero hace una sola comparacion (mayor que)
uiIndex > hDS->uiColCount
2. si se cumple, no continúa con la segunda comparación.
En cambio, con la primera forma
> if( uiIndex > 0 && uiIndex <= hDS->uiColCount )
1. tiene que hacer dos comparaciones (menor que e igual que) y si se cumple
uiIndex <= hDS->uiColCount
2. forzosamente tiene que hacer la siguiente comprobación.
Aunque, mirando ambos, veo que todo depende de la distribución de las
comprobaciones a hacer....
Saludos,
José Luis Capel
En la primera forma tiene que comprobar
"Manu" <messoft@gmail.com> escribió en el mensaje
news:[email=49922d6b@svctag-j7w3v3j....]49922d6b@svctag-j7w3v3j....[/email]
> Qué es más rápido...
> esto:
> if( uiIndex > 0 && uiIndex <= hDS->uiColCount )
> o esto:
> if( !( uiIndex < 1 || uiIndex > hDS->uiColCount ) )
>
> ?????????????
>
> Se supone que las dos son equivalentes en cuanto al resultado, pero cual
> es más rápido en la ejecución?

Pregunta para satisfacer mi calenturienta mente...

Publicado: Mié Feb 11, 2009 4:33 pm
por notengo
Manu,
compila con la opción de generar la salida en ensamblador y mira el código
generado. Esto es lo que genera (está simplificado) con tu código de
ejemplo (cambiando hDS->uiColCount por uiColCount):
; if( uiIndex > 0 && uiIndex <= uiColCount )
test eax,eax
jbe short @4
cmp edx,eax
; if( !( uiIndex < 1 || uiIndex > uiColCount ) )
cmp eax,1
jb short @7
cmp edx,eax
Puedes mirar cuánto "tiempo" tarda en ejecutarse cada instrucción en
ensamblador pero yo no me calentarí­a mucho la cabeza con eso. Los
compiladores optimizan el código generado (en el código anterior no he
utilizado ningún flag para optimizar) todo lo que pueden y la diferencia
sólo serán unos milisegundos.
Saludos,
José Lalí­n

Pregunta para satisfacer mi calenturienta mente...

Publicado: Mié Feb 11, 2009 4:38 pm
por Manu Exposito
Gracias por tu opinión...
Tambien esta esta:
unsigned int uiIndex = hb_parni( 2 ); // Así­ está definida
if( uiIndex && uiIndex <= hDS->uiColCount )
o esta
if( uiIndex && !( uiIndex > hDS->uiColCount ) )
Walter, José... opinad!!!
:-)
José Luis Capel escribió:
> Hola Manu,
>
> Yo creo que la segunda forma
>
>> if( !( uiIndex < 1 || uiIndex > hDS->uiColCount ) )
>
> por que entiendo que
>
> 1. primero hace una sola comparacion (mayor que)
> uiIndex > hDS->uiColCount
> 2. si se cumple, no continúa con la segunda comparación.
>
> En cambio, con la primera forma
>
>> if( uiIndex > 0 && uiIndex <= hDS->uiColCount )
>
> 1. tiene que hacer dos comparaciones (menor que e igual que) y si se cumple
> uiIndex <= hDS->uiColCount
> 2. forzosamente tiene que hacer la siguiente comprobación.
>
>
> Aunque, mirando ambos, veo que todo depende de la distribución de las
> comprobaciones a hacer....
>
> Saludos,
> José Luis Capel
>
>
>
> En la primera forma tiene que comprobar
> "Manu" <messoft@gmail.com> escribió en el mensaje
> news:[email=49922d6b@svctag-j7w3v3j....]49922d6b@svctag-j7w3v3j....[/email]
>> Qué es más rápido...
>> esto:
>> if( uiIndex > 0 && uiIndex <= hDS->uiColCount )
>> o esto:
>> if( !( uiIndex < 1 || uiIndex > hDS->uiColCount ) )
>>
>> ?????????????
>>
>> Se supone que las dos son equivalentes en cuanto al resultado, pero cual
>> es más rápido en la ejecución?
>
>

Pregunta para satisfacer mi calenturienta mente...

Publicado: Mié Feb 11, 2009 4:41 pm
por Manu Exposito
Gracias José, esperaba tu opinión :-)
José Lalí­n escribió:
>
> Manu,
>
> compila con la opción de generar la salida en ensamblador y mira el
> código generado. Esto es lo que genera (está simplificado) con tu código
> de ejemplo (cambiando hDS->uiColCount por uiColCount):
>
> ; if( uiIndex > 0 && uiIndex <= uiColCount )
> test eax,eax
> jbe short @4
> cmp edx,eax
>
> ; if( !( uiIndex < 1 || uiIndex > uiColCount ) )
> cmp eax,1
> jb short @7
> cmp edx,eax
>
> Puedes mirar cuánto "tiempo" tarda en ejecutarse cada instrucción en
> ensamblador pero yo no me calentarí­a mucho la cabeza con eso. Los
> compiladores optimizan el código generado (en el código anterior no he
> utilizado ningún flag para optimizar) todo lo que pueden y la diferencia
> sólo serán unos milisegundos.
>
> Saludos,
> José Lalí­n