什么会更快?这样:
sprintf(&str[strlen(str)], "Something");
或
strcat(str, "Something");
有任何性能差异吗?
答案 0 :(得分:22)
strcat
会更快,因为sprintf
必须首先扫描字符串以查找格式变量。
但真正的胜利是每个人都知道strcat
正在做什么 - 连接字符串。使用sprintf
进行连接不是标准用法。它会让人们做双重拍摄。
答案 1 :(得分:10)
鉴于两者之间的选择,我选择strcat
;它肯定更具可读性,使你的意图清晰。它也可能比sprintf
略快,但可能不会太多。
但是,无论您选择哪种方法,都应该使用snprintf
或strncpy
进行缓冲区溢出保护。
您已将此问题标记为c
和c++
;如果您使用的是C ++,那么使用std::string
代替它会好得多。
答案 2 :(得分:6)
如果存在差异,那么差异会因编译器标志,代码运行时的计算机使用情况,库实现,...,......而异。
针对您的具体情况,衡量 将两个片段运行几十亿次并计时。
我非常怀疑你会发现任何重大差异。
我更喜欢strcat()
:它清楚地传达了代码的含义。
答案 3 :(得分:1)
strcat
要快得多。请记住,sprintf()
逐个字符地解析格式字符串,以查找%escapes。将其与:
strcpy (str + strlen (str), "Something");
例如。
答案 4 :(得分:1)
我同意其他人:strcat()
应该更快。但对于“最佳实践”,如果你真的关心速度,你就不应该使用。你最好有一个像这样的结构:
typedef struct { size_t len, max; char *str; } mystring_t;
跟踪字符串的结尾。附加字符串时,只需跳到最后并复制即可。如果分配的内存不够大,请加倍max
。或者,通过将len
,max
和str
打包在一起,您可能会有点想象。