Hacer un IN en C#

08/02/2007 - 08:47 por Pelusa | Informe spam
Hola a tod@s,

¿alguien sabe si en C# se puede hacer algo parecido a un IN?

es decir, algo semejante a esto:

int i = 3;

if (i IN (1,3,5,7))
{
hacer_algo();
}

Preguntas similare

Leer las respuestas

#11 Hernan
09/02/2007 - 17:31 | Informe spam
Pues yo sigo sin entender porque decis que:

bool In(int i, params int[] a)
{
for (int j=0; j<a.Length; j++)
if (a[j]==i) return true;
return false;

}

es mas rapido que:

bool In(int i, params int[] a)
{
return (Array.Find(a, delegate(int p){ return p == i; }) == i);

}

Supongo que Find hace lo mismo: Por cada elemento del array llama al
predicate. Luego tenemos la busqueda en el primer ejemplo con codigo
manejado:

for (int j=0; j<a.Length; j++)
// Llamada al predicate
return false;

Sin embargo Find, dentro, ya no es manejado.
Por lo poco que conozco yo de NET, las funciones de la libreria son
mas rapidas que cualquier codigo manejado que haga lo mismo o no??
Apostaria a que es mas rapido el metodo Find.



Humm... No se.
Entrar y salir de código manejado no es barato, no?

Igual esto de especular sobre performance es un poco tonto.
Lo que realmente vale es medir o, como mínimo, desensamblar.

-H.
Respuesta Responder a este mensaje
#12 Alberto Poblacion
09/02/2007 - 18:05 | Informe spam
"Roberto M. Oliva" wrote in message
news:
Pues yo sigo sin entender porque decis que:
[bucle for]
es mas rapido que:
return (Array.Find(a, delegate(int p){ return p == i; }) == i);

Supongo que Find hace lo mismo: Por cada elemento del array llama al
predicate.



Sí, eso es lo que hace. Y eso es costoso. Tiene que hacer una
indirección a través del delegado para llamar al predicate, mientras que el
bucle for lo tiene en linea.

Sin embargo Find, dentro, ya no es manejado.



Sí que lo es. Está escrito en una de las DLLs de .Net, que se ha
programado con C#. De lo contrario, serían costosísimos los saltos entre
código gestionado y no gestionado (uno para llamar al Find y uno más por
cada iteración del bucle para llamar al predicado).

Apostaria a que es mas rapido el metodo Find.



Antes de enviar el mensaje en el que dije que era casi el triple de
rápido, lo probé. Escribí las dos funciones, y las llamé un millón de veces
cronometrando el tiempo que tardaban. La versión del for es casi el triple
de rápida que la del Find, con 4 valores en el IN.
Respuesta Responder a este mensaje
#13 Roberto M. Oliva
09/02/2007 - 18:46 | Informe spam
Hola Alberto!

Esto es lo que no veia:

Sí, eso es lo que hace. Y eso es costoso. Tiene que hacer una
indirección a través del delegado para llamar al predicate, mientras que el
bucle for lo tiene en linea.




Tienes toda la razon! Muchas gracias!

Un saludo
Roberto M. Oliva
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida