什麼會更快?這:strcat()vs sprintf()
sprintf(&str[strlen(str)], "Something");
或
strcat(str, "Something");
是否有任何性能差異?
什麼會更快?這:strcat()vs sprintf()
sprintf(&str[strlen(str)], "Something");
或
strcat(str, "Something");
是否有任何性能差異?
strcat
會更快,因爲sprintf
必須首先掃描字符串尋找格式變量。
但真正的勝利是每個人都知道strcat
在做什麼 - 連接字符串。連接使用sprintf
不是標準用法。這會導致人們做雙重考慮。
鑑於兩者之間的選擇,我會選擇strcat
;它當然更具可讀性,並使你的意圖清晰。它也可能比sprintf
稍快,但可能不會太多。
但是,無論您選擇哪種方法,您都應該使用snprintf
或strncpy
作爲緩衝區溢出保護。
您已將此問題標記爲c
和c++
;如果您使用的是C++,那麼使用std::string
會更好。
strncpy()can讓你沒有終結者。 strlcpy()或strlcat()會更好。 – 2009-11-20 19:23:29
如果有一個差別,這種差別根據編譯器標誌,使用電腦在運行代碼的時候,庫實現變化,...,...
針對您的特殊情況下,措施。
運行這兩個片段幾十億次,並計時。
我非常懷疑你會發現任何顯着的差異。
我更喜歡strcat()
:它清楚地表達了代碼的含義。
strcat
在這種情況下要快得多。請記住,sprintf()
逐字符地解析格式字符串尋找%轉義。比較此:
strcpy (str + strlen (str), "Something");
例如。
我同意他人:strcat()
應該會更快。但是對於「最佳實踐」,如果你真的關心速度,你就不應該使用。你最好有一個像這樣的結構:
typedef struct { size_t len, max; char *str; } mystring_t;
跟蹤字符串的結尾。當你追加一個字符串時,只需跳到最後並複製它。如果分配的內存不夠大,請雙擊max
。或者,您也可以將len
,max
和str
放在一起。
@Jonathan Feinberg - 這不就是Stack Overflow的一部分嗎?當然,他可能需要進行一次性能測試,但是如果其他人已經做到了,那麼爲什麼要重新開始呢? – 2009-11-20 19:16:09
請注意,sprintf的好用是'sprintf(str,「%s」,other_str)',而不是'sprintf(str,other_str)',否則你可能冒着格式化字符串漏洞的風險 – abyx 2009-11-20 19:18:22