Was wäre schneller? Das:
sprintf(&str[strlen(str)], "Something");
oder
strcat(str, "Something");
Gibt es einen Leistungsunterschied?
lxe
Was wäre schneller? Das:
sprintf(&str[strlen(str)], "Something");
oder
strcat(str, "Something");
Gibt es einen Leistungsunterschied?
Justin Rudd
strcat
wäre schneller, weil sprintf
muss zuerst die Zeichenfolge nach Formatvariablen durchsuchen.
Aber der wahre Gewinn ist die Tatsache, dass jeder weiß, was strcat
tut – Zeichenfolgen verketten. Benutzen sprintf
denn Verkettung ist keine Standardverwendung. Und es würde dazu führen, dass die Leute doppelt hinsehen.
Wenn ich die Wahl zwischen beiden hätte, würde ich mich entscheiden strcat
; Es ist auf jeden Fall besser lesbar und macht Ihre Absichten klarer. Es könnte auch etwas schneller sein als sprintf
aber wahrscheinlich nicht viel.
Doch egal für welche Methode Sie sich entscheiden, Sie sollten diese unbedingt nutzen snprintf
oder strncpy
zum Schutz vor Pufferüberlauf.
Sie haben diese Frage als beides markiert c
Und c++
; Wenn Sie C++ verwenden, wäre es weitaus besser, a zu verwenden std::string
stattdessen.
strncpy() kann dazu führen, dass Sie kein Terminator verwenden. strlcpy() oder strlcat() wären besser.
– Randy Proctor
20. November 2009 um 19:23
pmg
Wenn es einen Unterschied gibt, variiert dieser Unterschied je nach Compiler-Flags, Computernutzung zum Zeitpunkt der Ausführung des Codes, Bibliotheksimplementierung usw.
Für Ihren konkreten Fall: messen.
Führen Sie beide Snippets ein paar Milliarden Mal aus und messen Sie sie zeitlich.
Ich bezweifle sehr, dass Sie einen signifikanten Unterschied feststellen werden.
Ich mag strcat()
Besser: Es vermittelt klar die Bedeutung des Codes.
Benutzer172818
Ich stimme anderen zu: strcat()
sollte schneller sein. Aber als „Best-Practice“ sollten Sie keines von beiden verwenden, wenn Ihnen die Geschwindigkeit wirklich am Herzen liegt. Sie sollten besser eine Struktur wie diese haben:
typedef struct { size_t len, max; char *str; } mystring_t;
um das Ende der Zeichenfolge im Auge zu behalten. Wenn Sie eine Zeichenfolge anhängen, springen Sie einfach zum Ende und kopieren Sie sie. Doppelt max
wenn der zugewiesene Speicher nicht groß genug ist. Alternativ können Sie auch etwas Ausgefallenes einpacken len
, max
Und str
zusammen.
Paul Hsieh
strcat
ist in diesem Fall viel schneller. Erinnere dich daran sprintf()
Analysiert die Formatzeichenfolge Zeichen für Zeichen und sucht nach %-Escapezeichen. Vergleichen Sie dies mit:
strcpy (str + strlen (str), "Something");
Zum Beispiel.
@Jonathan Feinberg – Ist das nicht teilweise der Sinn von Stack Overflow? Sicher, er könnte wahrscheinlich einen Leistungstest auf die Beine stellen, aber wenn es schon jemand anders gemacht hat, warum sollte man dann das Rad neu erfinden?
– Graeme Perrow
20. November 2009 um 19:16 Uhr
Bitte beachten Sie, dass die Verwendung von sprintf sinnvoll ist
sprintf(str, "%s", other_str)
und nichtsprintf(str, other_str)
Andernfalls riskieren Sie möglicherweise eine Sicherheitslücke in der Formatzeichenfolge– abyx
20. November 2009 um 19:18 Uhr