Cosa sarebbe più veloce? Questo:strcat() vs sprintf()
sprintf(&str[strlen(str)], "Something");
o
strcat(str, "Something");
C'è qualche differenza di prestazioni?
Cosa sarebbe più veloce? Questo:strcat() vs sprintf()
sprintf(&str[strlen(str)], "Something");
o
strcat(str, "Something");
C'è qualche differenza di prestazioni?
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.
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
.
strncpy() può lasciati senza un terminatore. strlcpy() o strlcat() sarebbe meglio. –
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.
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.
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.
@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? –
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