Co byłoby szybciej? To:strcat() vs sprintf()
sprintf(&str[strlen(str)], "Something");
lub
strcat(str, "Something");
Czy istnieje różnica wydajności?
Co byłoby szybciej? To:strcat() vs sprintf()
sprintf(&str[strlen(str)], "Something");
lub
strcat(str, "Something");
Czy istnieje różnica wydajności?
strcat
będzie szybszy, ponieważ sprintf
musi najpierw skanować ciąg w poszukiwaniu zmiennych formatowych.
Ale prawdziwą wygraną jest fakt, że każdy wie, co robi strcat
- łączenie łańcuchów. Używanie sprintf
do konkatenacji nie jest standardowym zastosowaniem. I spowodowałoby to podwójne podejście.
Biorąc pod uwagę wybór między dwoma, wybrałbym strcat
; jest to z pewnością bardziej czytelne i sprawia, że twoje intencje są jasne. Może być nieco szybszy niż sprintf
, ale prawdopodobnie nie za dużo.
Jednak niezależnie od wybranej metody zdecydowanie powinieneś używać snprintf
lub strncpy
do ochrony przed przepełnieniem bufora.
Oznaczono to pytanie jako c
i c++
; jeśli używasz C++, byłoby znacznie lepiej użyć zamiast niego std::string
.
strncpy() może zostawiam cię bez terminatora. strlcpy() lub strlcat() byłyby lepsze. –
Jeśli istnieje różnica, różnica ta zmienia się w zależności flag kompilatora, korzystania z komputera w czasie, gdy kod jest uruchomiony, wdrożenia biblioteki, ..., ...
dla konkretnego przypadku, miarą.
Uruchamiaj oba fragmenty kilka miliard razy i zmieniaj je.
Bardzo wątpię, że znajdziesz jakąś istotną różnicę.
Ja lubię strcat()
lepiej: wyraźnie przekazuje znaczenie kodu.
strcat
jest znacznie szybszy w tym przypadku. Pamiętaj, że sprintf()
analizuje znak ciągu formatującego według znaku, szukając% escapes. Porównaj to z:
strcpy (str + strlen (str), "Something");
na przykład.
Zgadzam się z innymi: strcat()
powinien być szybszy. Ale jeśli chodzi o "najlepszą praktykę", jeśli naprawdę zależy Ci na szybkości, nie powinieneś jej używać. Lepiej mieć strukturę typu:
typedef struct { size_t len, max; char *str; } mystring_t;
, aby śledzić koniec ciągu. Kiedy dodajesz ciąg, po prostu przeskocz na koniec i skopiuj go. Podwójnie max
, jeśli przydzielona pamięć nie jest wystarczająco duża. Ewentualnie możesz mieć coś fajnego, pakując razem: len
, max
i str
.
@ Jonathan Feinberg - czy to nie jest częściowo kwestia przepełnienia stosu? Pewnie, że prawdopodobnie mógłby pobudzić test wydajności, ale jeśli ktoś już to zrobił, po co wymyślać koło? –
Zwróć uwagę, że dobrym użytkiem dla sprintf jest 'sprintf (str,"% s ", other_str)', a nie 'sprintf (str, other_str)' lub możesz ryzykować usterką ciąg formatu – abyx