我正在测试这段代码:
string teststring = "";
int i = 0;
while ( i < 100000000 ) {
i++;
}
执行时间为: 0.359秒。
然后我尝试再次执行完全相同的测试,但这一次我在循环中添加了额外的一行:
string teststring = "";
int i = 0;
while ( i < 100000000 ) {
i++;
teststring += "something random";
}
执行时间为4s。
这是一个额外的行,它真的需要更长的时间吗?我可以做一些不同的事情来改善这一点吗?
发布于 2018-08-01 18:00:42
teststring += "something random";
将如何实现?类似于:
str = "something random";
for( int i = 0; i < sizeof(str); i++ )
teststring[teststring.length+i] = str[i];
更不用说如果teststring
不够大,它必须使一个新的内存区域增加两倍,然后复制每个字节,然后继续(测试字符串在代码中会变得非常大,使得复制操作非常昂贵)。与i++
相比,这非常复杂,因此后者的速度更快是有道理的。
发布于 2018-08-01 20:45:32
除了Nicholas Pipitone的观点之外,优化编译器可以合法地消除原始的for循环,并将其替换为:
int i=100000001;
优化编译器也可以对字符串连接执行同样的操作,但它可能没有捕捉到这种情况(可能是因为字符串连接函数可能表明它可以抛出异常,而编译器可能不知道如何处理)。
https://stackoverflow.com/questions/51638811
复制