QT 多线程的优化

关于QT多线程的优化

在开发项目时,需要用到大量的计算。该项目主要是对信号的处理。
在进行welch数据分段时,刚开始使用的是如下程序

    while(i < org_N - per_length + 1){
        vector<float> temp;
        for (int j = i; j < i + per_length - 1; ++j) {
            temp.push_back(data[j]);
        }
        i = i + no_hide;
    }

如果使用该代码,多线程数据反而比单线程计算要慢上一倍多。如果改做使用迭代器导入分段的数据,多线程数据比单线程计算要快上一倍多。

    while(i < org_N - per_length + 1){
        vector<float> temp;
        for (int j = i; j < i + per_length - 1; ++j) {
            temp.push_back(data[j]);
        }
        i = i + no_hide;
    }
    while(i < org_N - per_length + 1){
        vector<float> temp;
        auto start = data.begin() + i;
        auto end = data.begin() + i + per_length;
        std::vector<float> sub_v;
        temp.insert(temp.begin(), start, end);
        result.emplace_back(temp);
        i = i + no_hide;
    }

再有一处地方改动在于,类的初始化。原先单线程使用以下代码。

    vector<complex<float>> result;
    for (int i = 0; i < size; ++i) {
        complex<float> temp = dataX[i]*conj(dataY[i]) / sum_w;
        for(int j = 0 ; j< temp.size(); j++){
        	result.push_back(temp);
        }
    }

后来改用

    vector<complex<float>> result(size);
    for (int i = 0; i < size; ++i) {
        result.at(i) = dataX[i]*conj(dataY[i]) / sum_w;
    }

改用改代码后从原先多线程 10s多变成了240多ms,而单线程使用相同的代码却为3s左右。

总结

1、在使用多线程时,能够对变量进行充分的初始化就进行初始化,减少局部变量的使用。
2、在进行赋值时,可以多使用迭代器的方法进行赋值。

最后,想问一问懂得人为什么这么做,多线程就能比单线程快,不这么做就慢很多。单线程和多线程在执行上述两个函数时都会使用同一段代码。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值