我正在测试此代码:
string teststring = "";
int i = 0;
while ( i < 100000000 ) {
i++;
}
执行时间为:0.359 s。
然后我尝试再次进行完全相同的测试,但是这次我在循环中添加了额外的一行:
string teststring = "";
int i = 0;
while ( i < 100000000 ) {
i++;
teststring += "something random";
}
执行时间为4 s。
这是另外一行,是否真的需要更长的时间?我可以做些其他事情来改善这一点吗?
答案 0 :(得分:4)
如何实施teststring += "something random";
?像这样:
str = "something random";
for( int i = 0; i < sizeof(str); i++ )
teststring[teststring.length+i] = str[i];
更不用说teststring
是否足够大,它必须创建一个两倍大的新内存区域,并复制每个字节,然后继续(测试字符串在代码中将变得非常大) ,使该复制操作相当昂贵)。与i++
相比,这非常复杂,因此可以认为后者要快得多。
答案 1 :(得分:1)
除了Nicholas Pipitone的观点之外,优化的编译器还可以合法地消除原始的for循环并将其替换为:
int i = 100000001;
优化的编译器可以对字符串合并执行相同的操作,但是它可能并没有费心抓住这种情况(可能是因为字符串合并功能可能表明它可以引发异常,编译器可能不知道如何处理)