2009-11-20 13 views
8

Cosa sarebbe più veloce? Questo:strcat() vs sprintf()

sprintf(&str[strlen(str)], "Something"); 

o

strcat(str, "Something"); 

C'è qualche differenza di prestazioni?

+3

@Jonathan Feinberg - Non è in parte il punto di Stack Overflow? Certo, potrebbe probabilmente montare un test delle prestazioni, ma se qualcun altro l'ha già fatto, perché reinventare la ruota? –

+3

Si noti che il buon uso di sprintf è 'sprintf (str,"% s ", other_str)', e non 'sprintf (str, other_str)', altrimenti si rischia una vulnerabilità della stringa di formato – abyx

risposta

21

strcat sarebbe più veloce perché sprintf deve prima eseguire la scansione della stringa alla ricerca di variabili di formato.

Ma la vera vittoria è il fatto che tutti sanno cosa sta facendo strcat - concatenando stringhe. L'uso di sprintf per la concatenazione non è un uso standard. E farebbe sì che le persone facciano un doppio giro.

10

Data la scelta tra i due, sceglierei strcat; è sicuramente più leggibile e rende chiare le tue intenzioni. Potrebbe anche essere leggermente più veloce di sprintf, ma probabilmente non di molto.

Tuttavia, indipendentemente dal metodo scelto, è assolutamente necessario utilizzare snprintf o strncpy per la protezione da sovraccarico del buffer.

Hai taggato questa domanda come sia c e c++; se stai usando C++, sarebbe molto meglio usare un std::string.

+2

strncpy() può lasciati senza un terminatore. strlcpy() o strlcat() sarebbe meglio. –

6

Se c'è una differenza, quella differenza varia in base al flag di compilazione, l'utilizzo del computer al momento il codice è in esecuzione, implementazione biblioteca, ..., ...

Per il vostro caso specifico, misura.
Esegui entrambi gli snippet qualche miliardo di volte e li interrompe.

Dubito che troverete molte differenze significative.

Mi piace strcat() meglio: trasmette chiaramente il significato del codice.

1

strcat è molto più veloce in questo caso. Ricorda che sprintf() analizza la stringa di formato carattere per carattere cercando% escape. Confronta questo a:

strcpy (str + strlen (str), "Something"); 

per esempio.

1

Sono d'accordo con gli altri: strcat() dovrebbe essere più veloce. Ma per "best-practice", se ti interessa davvero la velocità, non dovresti usare nessuno dei due. È meglio avere una struttura come:

typedef struct { size_t len, max; char *str; } mystring_t; 

per tenere traccia della fine della stringa. Quando si aggiunge una stringa, basta saltare fino alla fine e copiarla. Raddoppia max se la memoria allocata non è abbastanza grande. In alternativa, potresti avere qualcosa di un po 'elegante comprimendo len, max e str insieme.