- 主题:求助一个c++高性能开发问题
请高手们帮忙看一下,
一个函数,输入xn包含有76657个double数据,经过浮点数除法运算以后输出yn,输出yn是需要有约44960个double数据,yn的结果要push到pStream里面,为了输出到文件或者数据库,需要在0.5s内完成,最好是越快越好。基本的运算方案不能做修改,只能想办法提升效率。目前发现
会有卡顿。不知道有没有什么比较极致的提高效率的方法。
目前可能卡顿在几个地方:
1,pStream的效率不够高
2,qvector的效率不够高
3,大量的浮点数除法运算的效率不够高。
4,循环的次数太多了。
void function(const QVector<double> &xn, const double &ts, QVector<double> &yn, const int &dsp_period, double frequency, std::ostringstream *pStream)
运算为:
yn_data[m] = (1 + n -m*ratio)*xn_data[n] + (- n + m * ratio)*xn_data[n+1] ;
*pStream << yn_data[0] << "\r\n";
--
FROM 110.87.25.*
:),感谢各位高手的热情回复。
目前感觉还是架构设计的不够理想和不够清晰,虽然用了多线程的方法(16个通道用了16个线程),但是每个线程里面短时间内要处理的内容还是很多,有没有什么比较简单又健壮的并行计算的方式?或者有一些案例或者教材之类的先推荐学习一下,多谢啦。
也问了AI很多问题,感觉有一些小的优化措施,但是到提出优化10倍或者提升更多性能的时候就迷糊了。如果能有高手讲解一下架构或者怎么通过AI问此类问题就好了。在代码已经有的基础上提问AI优化工程。
硬件目前没法升级,在i5的笔记本上运行都会因为这块的效率问题影响到了其他底层线程的usb通信,频率不算高,30分钟影响1s,但是目标是24小时连续不影响。将来还可能把方案往单片机或者手机平板上面移植,硬件会更局限。。
--
FROM 120.41.215.*
【 在 callmebbser 的大作中提到: 】
: 一个通道1秒才几百K的数据,完全不是什么大数据量。生产-消费者模式,后台接收、处
: 理,不至于忙不过来。
: 大概率还是新手、初学者写得代码太小学生了。
: ...................
架构的确不太行。被难住了。请高手支招:)
实际上数据量比较大,打底是一个基础线程base在用无锁队列收集16个通道的数据+保存数据到数据库A,大概是10分钟不到4个G的数据1700万+*16个double类型的浮点数(有效数字保存为小数点后8位)。这块目前还没有发现问题,因为没有涉及浮点数的运算,连续跑10多G数据还好。然后是叠加新的16个Reconstruction线程,每个通道的线程预期同时要在0.3s内从前面的数据库A取完数据后完成5万个double类型浮点数的运算+保存到另外一个数据库B,叠加Reconstruction这块会影响到前面的基础线程,30分钟会停1s,30分钟的Reconstruction的数据量大概是3G附近,1s的停顿会造成约25K个数据的丢失。要求是base和Reconstruction两大块都是连续24小时跑,停的时间不能超过10us.没太明白为啥会出现停顿。目前还是怀疑架构不合理。试了把Reconstruction数据保存为double数组也还没达成目标。后面还要再叠加另外一个double浮点数运算的功能(数据量会小很多),还有算法模块线程和仿真线程,感觉架构吃不消。不过能够先解决前面两个base+Reconstruction并存24小时无缝运行也是很好的。
--
FROM 120.41.215.*
【 在 foliver 的大作中提到: 】
: 看了半天,你还是没有指出问题所在。
: 你首先应该用各种工具,函数记时,找热点函数等等,找到时间消耗在哪里,然后再针对性优化。
: 你这样毫无目的的修改代码除了浪费时间,一点帮助都没有
嗯嗯,没太多这方面的经验。感谢提供建议,我们往这个方向试一下。
大家讨论一下,感觉有一些眉目了,感谢:)
--
修改:xmbba FROM 120.41.215.*
FROM 120.41.215.*