2009-11-20 12 views
8

Co byłoby szybciej? To:strcat() vs sprintf()

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

lub

strcat(str, "Something"); 

Czy istnieje różnica wydajności?

+3

@ 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? –

+3

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

Odpowiedz

21

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.

10

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.

+2

strncpy() może zostawiam cię bez terminatora. strlcpy() lub strlcat() byłyby lepsze. –

6

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.

1

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.

1

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.

Powiązane problemy