关于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、在进行赋值时,可以多使用迭代器的方法进行赋值。
最后,想问一问懂得人为什么这么做,多线程就能比单线程快,不这么做就慢很多。单线程和多线程在执行上述两个函数时都会使用同一段代码。