c++ string 函数优化后,执行反而耗时很高,求解惑

查看 96|回复 5
作者:csfreshman   
#include [i]
//优化前函数 remove_ctrl
std::string remove_ctrl(std::string s) {
    std::string result;
    for(int i = 0;i = 0x20)
            result = result + s[i];
    }
    return result;
}
//优化后函数 remove_ctrl_opt
std::string remove_ctrl_opt(const std::string& src,std::string& dst) {
    int n = src.size();
    dst.reserve(n);
    for(auto it = src.begin();it != src.end();it++) {
        if(*it >= 0x20)
            dst +=  *it;
    }
    return dst;
}
int main(){
    std::string src = "hello,world,hello,world,hello,world,hello,world,hello,world,hello,world,hello,world,hello,world";
    std::string result;
    for(int i = 0;i
优化函数,从参数拷贝,string 提前 reserve,减少临时变量,结果分别循环 1000000 次,使用 time ./a.out 测试执行时间,优化后的耗时反而很高(优化前 6s 左右,优化后 60s 没执行完直接 control+c 了)。
排查原因,发现将函数 remove_ctrl_opt 的返回类型修改为 void,函数体 return;优化后耗时提升 6 倍左右。
这到底是什么原因? return string ,难道开销这么大?但是优化前函数也是这样,执行才 6s 。

string, std, result, 函数

liberize   
remove_ctrl 返回一个 local string ,编译器做 RVO (Return value optimization) ,避免拷贝
remove_ctrl_opt 返回值无法优化,肯定会拷贝
agagega   
remove_ctrl_opt 都把 dst 作为引用传进来了,为什么还要 return ?这个 return 必然导致 copy
exiledkingcc   
remove_ctrl_opt 都是错的没发现吗? dst 要先 clear 。
即便改对了也是不行,因为 remove_ctrl 有 RVO 优化,楼上已经提到了。
另外,为什么不用 std::copy_if 或者 std::move_if ?
lovelylain   
因为你这优化出 bug 了,原来的版本编译器本身会做返回值优化,所以返回 string 没有性能问题,你优化为传入引用后,每次调用复用同一个对象且没有 clear ,string 越来越长占用内存越来越多,不慢才怪了。
Inn0Vat10n   
这俩函数逻辑都不等价,你是想比较什么?
您需要登录后才可以回帖 登录 | 立即注册

返回顶部