2009-11-20 82 views
8

什麼會更快?這:strcat()vs sprintf()

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

strcat(str, "Something"); 

是否有任何性能差異?

+3

@Jonathan Feinberg - 這不就是Stack Overflow的一部分嗎?當然,他可能需要進行一次性能測試,但是如果其他人已經做到了,那麼爲什麼要重新開始呢? – 2009-11-20 19:16:09

+3

請注意,sprintf的好用是'sprintf(str,「%s」,other_str)',而不是'sprintf(str,other_str)',否則你可能冒着格式化字符串漏洞的風險 – abyx 2009-11-20 19:18:22

回答

21

strcat會更快,因爲sprintf必須首先掃描字符串尋找格式變量。

但真正的勝利是每個人都知道strcat在做什麼 - 連接字符串。連接使用sprintf不是標準用法。這會導致人們做雙重考慮。

10

鑑於兩者之間的選擇,我會選擇strcat;它當然更具可讀性,並使你的意圖清晰。它也可能比sprintf稍快,但可能不會太多。

但是,無論您選擇哪種方法,您都應該使用snprintfstrncpy作爲緩衝區溢出保護。

您已將此問題標記爲cc++;如果您使用的是C++,那麼使用std::string會更好。

+2

strncpy()can讓你沒有終結者。 strlcpy()或strlcat()會更好。 – 2009-11-20 19:23:29

6

如果有一個差別,這種差別根據編譯器標誌,使用電腦在運行代碼的時候,庫實現變化,...,...

針對您的特殊情況下,措施
運行這兩個片段幾十億次,並計時。

我非常懷疑你會發現任何顯着的差異。

我更喜歡strcat():它清楚地表達了代碼的含義。

1

strcat在這種情況下要快得多。請記住,sprintf()逐字符地解析格式字符串尋找%轉義。比較此:

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

例如。

1

我同意他人:strcat()應該會更快。但是對於「最佳實踐」,如果你真的關心速度,你就不應該使用。你最好有一個像這樣的結構:

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

跟蹤字符串的結尾。當你追加一個字符串時,只需跳到最後並複製它。如果分配的內存不夠大,請雙擊max。或者,您也可以將lenmaxstr放在一起。