¿Qué sería más rápido? Este:strcat() vs sprintf()
sprintf(&str[strlen(str)], "Something");
o
strcat(str, "Something");
¿Hay alguna diferencia de rendimiento?
¿Qué sería más rápido? Este:strcat() vs sprintf()
sprintf(&str[strlen(str)], "Something");
o
strcat(str, "Something");
¿Hay alguna diferencia de rendimiento?
strcat
sería más rápido porque sprintf
tiene que escanear primero la cadena en busca de variables de formato.
Pero la verdadera victoria es el hecho de que todo el mundo sabe lo que strcat
está haciendo - concatenando cadenas. Usar sprintf
para la concatenación no es un uso estándar. Y causaría que la gente hiciera una doble toma.
Dada la elección entre los dos, elegiría strcat
; ciertamente es más legible y deja claras tus intenciones. También podría ser ligeramente más rápido que sprintf
, pero probablemente no mucho.
Pero, independientemente del método que elija, definitivamente debe usar snprintf
o strncpy
para la protección de desbordamiento del búfer.
Marcó esta pregunta como c
y c++
; Si está usando C++, sería mucho mejor usar un std::string
en su lugar.
strncpy() puede dejarte sin un terminador. strlcpy() o strlcat() sería mejor. –
Si hay una diferencia, esa diferencia varía en función de parámetros del compilador, el uso del ordenador en el momento en que el código se ejecuta, implementación de la biblioteca, ..., ...
para su caso específico, medida.
Ejecutar ambos fragmentos unos billones de veces y cronometrarlos.
Dudo mucho que encuentre alguna diferencia significativa.
Me gusta strcat()
mejor: transmite claramente el significado del código.
strcat
es mucho más rápido en este caso. Recuerde que sprintf()
analiza la cadena de formato carácter por carácter buscando% escapes. Compare esto con:
strcpy (str + strlen (str), "Something");
por ejemplo.
Estoy de acuerdo con los demás: strcat()
debería ser más rápido. Pero para "mejores prácticas", si realmente te importa la velocidad, no deberías usar ninguna. Será mejor que tenga una estructura como:
typedef struct { size_t len, max; char *str; } mystring_t;
para realizar un seguimiento del final de la cadena. Cuando agregue una cadena, simplemente salte hasta el final y cópiela. Doble max
si la memoria asignada no es lo suficientemente grande. Alternativamente, puede tener algo un poco de fantasía al empacar len
, max
y str
juntos.
@Jonathan Feinberg - ¿No es parcialmente el objetivo de Stack Overflow? Claro, probablemente podría preparar una prueba de rendimiento, pero si alguien más ya lo ha hecho, ¿por qué reinventar la rueda? –
Tenga en cuenta que el buen uso de sprintf es 'sprintf (str,"% s ", other_str)', y no 'sprintf (str, other_str)', o puede estar arriesgando una vulnerabilidad de cadena de formato – abyx