if (str1 == str2) versus if (str1.length () == str2.length () && str1 == str2)

He visto el segundo en el código de otro y supongo que esta comparación de longitud se ha hecho para aumentar la productividad del código. Se usó en un analizador para un lenguaje de script con un diccionario específico: las palabras tienen una longitud de 4 a 24 letras con un promedio de 7-8 letras, el alfabeto incluye 26 letras latinas más "@", "$0$quot; y "_".

La comparación de longitudes se usó para escapar del operador == que trabaja con cadenas STL, lo que obviamente lleva más tiempo que la simple comparación de enteros. Pero al mismo tiempo, la distribución de la primera letra en el diccionario dado es simplemente más amplia que una distribución del tamaño de las palabras, por lo que las dos primeras letras de las cadenas de comparación serán generalmente más diferentes que los tamaños de esas cadenas. Eso hace que la comparación de longitud sea innecesaria.

He realizado algunas pruebas y eso es lo que he descubierto: si bien la comparación de dos cadenas aleatorias millones de veces, la segunda forma es mucho más rápida, por lo que la comparación de longitud parece ser útil. Pero en un proyecto de trabajo, funciona incluso más lento en un modo de depuración e insuficientemente más rápido en un modo de lanzamiento.

Entonces, mi pregunta es: ¿por qué la comparación de longitudes puede mejorar la comparación y por qué puede ralentizarla?

UPD: Tampoco me gusta esa segunda forma, pero se hizo por una razón, supongo, y me pregunto, ¿cuál es esta razón?

UPD2: En serio, la pregunta no es cómo hacerlo mejor. Ya ni siquiera estoy usando cadenas STL en este caso. No es de extrañar que la comparación de la longitud sea innecesaria e incorrecta, etc. La maravilla es que, en realidad, tiende a funcionar ligeramente mejor en una determinada prueba. ¿Cómo es esto posible?

Respuestas a la pregunta(8)

Su respuesta a la pregunta