versiones guia español descargar actualizar string language-agnostic uppercase

string - guia - Superior versus minúsculas



qgis manual (10)

Al hacer comparaciones insensibles a mayúsculas y minúsculas, ¿es más eficiente convertir la cadena en mayúsculas o minúsculas? ¿Incluso importa?

En esta publicación SO se sugiere que C # es más eficiente con ToUpper porque "Microsoft lo optimizó de esa manera". Pero también he leído este argumento de que la conversión de ToLower frente a ToUpper depende de qué cadenas contienen más y que, por lo general, las cadenas contienen más caracteres en minúsculas, lo que hace que ToLower sea más eficiente.

En particular, me gustaría saber:

  • ¿Hay alguna manera de optimizar ToUpper o ToLower de modo que uno sea más rápido que el otro?
  • ¿Es más rápido hacer una comparación insensible entre mayúsculas y minúsculas y por qué?
  • ¿Hay algún entorno de programación (por ejemplo, C, C #, Python, lo que sea) donde un caso es claramente mejor que el otro, y por qué?

Basado en cadenas tendientes a tener más entradas en minúsculas, ToLower debería ser teóricamente más rápido (muchas comparaciones, pero pocas asignaciones).

En C, o cuando se usan elementos accesibles individualmente para cada cadena (como C strings o STL''s string type en C ++), en realidad es una comparación byte, por lo que comparar UPPER no es diferente de lower .

Si fue astuto y cargó sus cadenas en long matrices en su lugar, obtendría una comparación muy rápida en toda la cadena porque podría comparar 4 bytes a la vez. Sin embargo, el tiempo de carga puede hacer que no valga la pena.

¿Por qué necesitas saber cuál es más rápido? A menos que esté haciendo una carga métrica de comparaciones, una que corra un par de ciclos más rápido es irrelevante para la velocidad de la ejecución general, y suena como una optimización prematura :)


De Microsoft en MSDN:

Microsoft

Recomendaciones para el uso de cadenas

¿Por qué? De Microsoft :

Normalizar cadenas a mayúsculas

Hay un pequeño grupo de caracteres que cuando se convierten a minúsculas no pueden hacer un viaje de ida y vuelta.

¿Cuál es el ejemplo de un personaje que no puede hacer un viaje redondo?

  • Inicio : Símbolo griego Rho (U + 03f1) ρ
  • Mayúsculas: Capital Griego Rho (U + 03a1) Ρ
  • Minúscula: Pequeña griega Rho (U + 03c1) ρ

ρ, Ρ , ρ

Por eso, si desea hacer comparaciones insensibles a mayúsculas y minúsculas, convierta las cadenas en mayúsculas y no en minúsculas.


Depende. Como se indicó anteriormente, solo aparece ASCII, es idéntico. En .NET, lee sobre y utiliza String.Compare es correcto para las cosas i18n (languages ​​cultures y unicode). Si sabe algo acerca de la probabilidad de la entrada, use el caso más común.

Recuerde, si está haciendo múltiples compases de cuerdas, la longitud es un excelente primer discriminador.


Hacerlo bien, debería haber una ventaja de velocidad pequeña e insignificante si convierte a minúsculas, pero esto es, como muchos han insinuado, dependiente de la cultura y no hereda en la función, sino en las cadenas que convierte (muchas letras minúsculas significa pocas asignaciones a la memoria): la conversión a mayúsculas es más rápida si tiene una cadena con muchas letras mayúsculas.


La conversión a mayúsculas o minúsculas para hacer comparaciones insensibles a mayúsculas y minúsculas es incorrecta debido a las características "interesantes" de algunas culturas, particularmente Turquía. En su lugar, use un StringComparer con las opciones adecuadas.

MSDN tiene algunas excelentes pautas sobre el manejo de cadenas. También es posible que desee comprobar que su código pase la prueba de Turquía .

EDITAR: Observe el comentario de Neil sobre las comparaciones ordinales insensibles a mayúsculas y minúsculas. Todo este reino es bastante turbio :(


Microsoft ha optimizado ToUpperInvariant() , no ToUpper() . La diferencia es que el invariante es más amigable con la cultura. Si necesita hacer comparaciones insensibles a mayúsculas y minúsculas en cadenas que pueden variar en el cultivo, utilice Invariant, de lo contrario, el rendimiento de la conversión invariante no debería importar.

No puedo decir si ToUpper () o ToLower () es más rápido. Nunca lo intenté, ya que nunca tuve una situación en la que el rendimiento importara tanto.


Realmente no debería importar. Con los caracteres ASCII, definitivamente no importa; son solo algunas comparaciones y un pequeño giro en cualquier dirección. Unicode podría ser un poco más complicado, ya que hay algunos personajes que cambian la carcasa de maneras extrañas, pero en realidad no debería haber ninguna diferencia a menos que el texto esté lleno de esos caracteres especiales.


Según MSDN , es más eficiente pasar las cadenas y decir a la comparación que ignore el caso:

String.Compare (strA, strB, StringComparison.OrdinalIgnoreCase) es equivalente a ( pero más rápido que ) llamar

String.Compare (ToUpperInvariant (strA), ToUpperInvariant (strB), StringComparison.Ordinal).

Estas comparaciones son aún muy rápidas.

Por supuesto, si está comparando una cadena una y otra vez, es posible que esto no se mantenga.


Si está haciendo una comparación de cadenas en C #, es significativamente más rápido usar .Equals () en lugar de convertir ambas cadenas en mayúsculas o minúsculas. Otra gran ventaja para usar .Equals () es que no se asigna más memoria para las 2 nuevas cadenas de mayúsculas / minúsculas.


Si se trata de ASCII puro, no importa. Es solo un OR x, 32 vs. un AND x, 224. Unicode, no tengo ni idea ...