Cual es mas rapida ?

27/08/2008 - 16:05 por Pedro | Informe spam
Tengo estas dos alternativas de funciones para convertir a ProperCase(). Es
decir tomar un string y llevarlo a formato de nombre propio:
ej. ProperCase("antonio RUIZ") -> "Antonio Ruiz"

Cual de estas dos funciones debe ser mas rapida:?

1)

public static string ProperCase(string stringInput)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
bool fEmptyBefore = true;
foreach (char ch in stringInput)
{
char chThis = ch;
if (Char.IsWhiteSpace(chThis))
fEmptyBefore = true;
else
{
if (Char.IsLetter(chThis) && fEmptyBefore)
chThis = Char.ToUpper(chThis);
else
chThis = Char.ToLower(chThis);
fEmptyBefore = false;
}
sb.Append(chThis);
}
return sb.ToString();
}


2)
public static string ProperCase(string cString)
{

//Create the StringBuilder
StringBuilder sb = new StringBuilder(cString);

int i,j = 0 ;
int nLength = cString.Length ;

for ( i = 0 ; i < nLength; i++)
{
//look for a blank space and once found make the next character to
uppercase
if ((i== 0) || (char.IsWhiteSpace(cString[i])))
{
//Handle the first character differently
if( i==0 ) {j=i;}
else {j=i+1;}

//Make the next character uppercase and update the stringBuilder
sb.Remove(j, 1);
sb.Insert(j, Char.ToUpper(cString[j]));
}
}
return sb.ToString();
}

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
27/08/2008 - 17:29 | Informe spam
En este tipo de preguntas de "cuál es más rápida", normalmente vale la pena
hacer un "benchmark" y probarlo, porque a veces te llevas sorpresas.

Dicho lo anterior, mi impresión es la siguiente:
- El tiempo necesario para construir el string de salida va a ser el factor
determinante. En comparación con eso, las comparaciones, indexaciones e
incremento de variables van a tener poco peso.
- La primera rutina construye el string completo, haciendo un Append por
cada carácter. La función Append del StringBuilder es en general rápida,
pero aun asi recibe tantas llamadas como caracteres tenga el string.
- La segunda rutina hace un Remove y un Insert por cada carácter que deba
pasar a mayúsculas (nótese que esta rutina no hace todo lo que la primera,
ya que esta segunda asume que la cadena llega en minúsculas). Estas dos
operaciones en el StrignBuilder son lentas... pero se hacen menos veces que
el Append de la primera.
En consecuencia: la velocidad relativa de ambas rutinas depende del
número de espacios en blanco de la cadena que se le pasa. Si hay muchos,
corre más la primera; si hay pocos, la segunda.

Pero todo esto es especulativo. Nunca se sabe con total certeza mientras
no se hace la prueba, como sugería al principio.

"Pedro" wrote in message
news:uvoR$
Tengo estas dos alternativas de funciones para convertir a ProperCase().
Es decir tomar un string y llevarlo a formato de nombre propio:
ej. ProperCase("antonio RUIZ") -> "Antonio Ruiz"

Cual de estas dos funciones debe ser mas rapida:?

1)

public static string ProperCase(string stringInput)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
bool fEmptyBefore = true;
foreach (char ch in stringInput)
{
char chThis = ch;
if (Char.IsWhiteSpace(chThis))
fEmptyBefore = true;
else
{
if (Char.IsLetter(chThis) && fEmptyBefore)
chThis = Char.ToUpper(chThis);
else
chThis = Char.ToLower(chThis);
fEmptyBefore = false;
}
sb.Append(chThis);
}
return sb.ToString();
}


2)
public static string ProperCase(string cString)
{

//Create the StringBuilder
StringBuilder sb = new StringBuilder(cString);

int i,j = 0 ;
int nLength = cString.Length ;

for ( i = 0 ; i < nLength; i++)
{
//look for a blank space and once found make the next character to
uppercase
if ((i== 0) || (char.IsWhiteSpace(cString[i])))
{
//Handle the first character differently
if( i==0 ) {j=i;}
else {j=i+1;}

//Make the next character uppercase and update the stringBuilder
sb.Remove(j, 1);
sb.Insert(j, Char.ToUpper(cString[j]));
}
}
return sb.ToString();
}


Respuesta Responder a este mensaje
#2 Pedro
27/08/2008 - 17:56 | Informe spam
Gracias por la respuesta pero disculpando mi ignorancia, como se hace un
benchmark para probarlo ?


"Alberto Poblacion"
escribió en el mensaje news:eF%
En este tipo de preguntas de "cuál es más rápida", normalmente vale la
pena hacer un "benchmark" y probarlo, porque a veces te llevas sorpresas.

Dicho lo anterior, mi impresión es la siguiente:
- El tiempo necesario para construir el string de salida va a ser el
factor determinante. En comparación con eso, las comparaciones,
indexaciones e incremento de variables van a tener poco peso.
- La primera rutina construye el string completo, haciendo un Append por
cada carácter. La función Append del StringBuilder es en general rápida,
pero aun asi recibe tantas llamadas como caracteres tenga el string.
- La segunda rutina hace un Remove y un Insert por cada carácter que deba
pasar a mayúsculas (nótese que esta rutina no hace todo lo que la primera,
ya que esta segunda asume que la cadena llega en minúsculas). Estas dos
operaciones en el StrignBuilder son lentas... pero se hacen menos veces
que el Append de la primera.
En consecuencia: la velocidad relativa de ambas rutinas depende del
número de espacios en blanco de la cadena que se le pasa. Si hay muchos,
corre más la primera; si hay pocos, la segunda.

Pero todo esto es especulativo. Nunca se sabe con total certeza mientras
no se hace la prueba, como sugería al principio.

"Pedro" wrote in message
news:uvoR$
Tengo estas dos alternativas de funciones para convertir a ProperCase().
Es decir tomar un string y llevarlo a formato de nombre propio:
ej. ProperCase("antonio RUIZ") -> "Antonio Ruiz"

Cual de estas dos funciones debe ser mas rapida:?

1)

public static string ProperCase(string stringInput)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
bool fEmptyBefore = true;
foreach (char ch in stringInput)
{
char chThis = ch;
if (Char.IsWhiteSpace(chThis))
fEmptyBefore = true;
else
{
if (Char.IsLetter(chThis) && fEmptyBefore)
chThis = Char.ToUpper(chThis);
else
chThis = Char.ToLower(chThis);
fEmptyBefore = false;
}
sb.Append(chThis);
}
return sb.ToString();
}


2)
public static string ProperCase(string cString)
{

//Create the StringBuilder
StringBuilder sb = new StringBuilder(cString);

int i,j = 0 ;
int nLength = cString.Length ;

for ( i = 0 ; i < nLength; i++)
{
//look for a blank space and once found make the next character to
uppercase
if ((i== 0) || (char.IsWhiteSpace(cString[i])))
{
//Handle the first character differently
if( i==0 ) {j=i;}
else {j=i+1;}

//Make the next character uppercase and update the stringBuilder
sb.Remove(j, 1);
sb.Insert(j, Char.ToUpper(cString[j]));
}
}
return sb.ToString();
}





Respuesta Responder a este mensaje
#3 Carlos Guzmán Álvarez
27/08/2008 - 19:09 | Informe spam
Hola:

Tengo estas dos alternativas de funciones para convertir a ProperCase(). Es
decir tomar un string y llevarlo a formato de nombre propio:
ej. ProperCase("antonio RUIZ") -> "Antonio Ruiz"



Has visto si te vale TextInfo.ToTitleCase ??
Respuesta Responder a este mensaje
#4 Alberto Poblacion
27/08/2008 - 19:21 | Informe spam
"Pedro" wrote in message
news:
Gracias por la respuesta pero disculpando mi ignorancia, como se hace un
benchmark para probarlo ?



Escribes un programa de prueba que llame 100.000 veces (por ejemplo) a
la subrutina en un bucle y cronometras cuánto tarda en ejecutarse (lo puedes
cronometrar desde dentro del propio programa usando DateTime.Now y la resta
de fechas). Si quieres refinarlo un poco, no llames siempre a la rutina con
la misma cadena; ve cambiando los valores usando una muestra significativa
de los datos reales. Lógicamente, tendrás que descontar del tiempo total de
ejecución el tiempo necesario para construir la muestra, que puedes
determinar ejecutando primero el programa con sólo ese bloque y sin llamar a
la rutina bajo prueba.
Respuesta Responder a este mensaje
#5 Pedro
27/08/2008 - 19:31 | Informe spam
Pues mira que no la habia visto y precisamente de eso hablaba otro compañero
en otro hilo de lo dificil que es encontrar las cosas en la ayuda de msn y
por esa razon hay que preguntar en los foros.

Gracias, ya veo que no tengo que preocuparme por hacer la funcion para eso.

Saludos.

"Carlos Guzmán Álvarez" escribió en el mensaje
news:%
Hola:

Tengo estas dos alternativas de funciones para convertir a ProperCase().
Es decir tomar un string y llevarlo a formato de nombre propio:
ej. ProperCase("antonio RUIZ") -> "Antonio Ruiz"



Has visto si te vale TextInfo.ToTitleCase ??
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida