Así que estaba jugando con un poco de código y quería ver qué método de conversión de std :: string a mayúsculas era más eficiente. Pensé que los dos serían algo similares en cuanto a rendimiento, pero estaba terriblemente equivocado. Ahora me gustaría averiguar por qué. El primer método de conversión de la cadena funciona de la siguiente manera: para cada carácter de la cadena (guarde la longitud, repita de 0 a la longitud), si está entre 'a' y 'z', cámbiela para que sea entre 'A' y 'Z' en su lugar.Conversión de std :: string a mayúsculas: ¿diferencia de rendimiento importante?
El segundo método funciona de la siguiente manera: para cada carácter en la cadena (empiece desde 0, continúe hasta que lleguemos a un terminador nulo), aplique la construcción en la función toupper().
Aquí está el código:
#include <iostream>
#include <string>
inline std::string ToUpper_Reg(std::string str)
{
for (int pos = 0, sz = str.length(); pos < sz; ++pos)
{
if (str[pos] >= 'a' && str[pos] <= 'z') { str[pos] += ('A' - 'a'); }
}
return str;
}
inline std::string ToUpper_Alt(std::string str)
{
for (int pos = 0; str[pos] != '\0'; ++pos) { str[pos] = toupper(str[pos]); }
return str;
}
int main()
{
std::string test = " [email protected]#$%^&*()_+=-`'{}[]\\|\";:<>,./?";
for (size_t i = 0; i < 100000000; ++i) { ToUpper_Reg(test); /* ToUpper_Alt(test); */ }
return 0;
}
El primer método ToUpper_Reg
tomó cerca de 169 segundos por 100 millones de iteraciones.
El segundo método Toupper_Alt
tomó aproximadamente 379 segundos por 100 millones de iteraciones.
¿Qué ofrece?
Editar: he cambiado el segundo método para que itera la cadena de cómo el primero de ellos no (establecer la longitud de lado, bucle while menos de longitud) y es un poco más rápido, pero todavía alrededor de dos veces lento.
Edición 2: Gracias a todos por sus presentaciones! La información en la que la utilizaré está garantizada como ASCII, así que creo que me quedaré con el primer método por el momento. Tendré en cuenta que toupper
es específico de la localidad para cuando/si lo necesito.
toupper es más lento que lo que haces en _Reg porque hace más de lo que haces en Reg? – Almo
¿Por qué no agrega también la transformación en C++ estándar, 'std :: transform (s.begin(), s.end(), s.begin(), (int (*) (int)) std :: toupper); '? (Necesita '#include', '' y ''.) –
Guau, eso es un bocado. Por curiosidad, ¿qué pasa con la parte '(int (*) (int))'? –