- 主题:求助一个c++高性能开发问题
把数据量增加十倍或者一百倍 然后看看热点在哪里
【 在 xmbba 的大作中提到: 】
: 请高手们帮忙看一下,
: 一个函数,输入xn包含有76657个double数据,经过浮点数除法运算以后输出yn,输出yn是需要有约44960个double数据,yn的结果要push到pStream里面,为了输出到文件或者数据库,需要在0.5s内完成,最好是越快越好。基本的运算方案不能做修改,只能想办法提升效率。目前发现
: 会有卡顿。不知道有没有什么比较极致的提高效率的方法。
: ...................
--
FROM 221.3.53.*
【 在 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.*
设备采集到的数据一般用整数或短整数传输,用double没有意义,毕竟AD或ADC一般是1
0位、16位、24位或32位。
接收到上位机后再根据需要转double进行重建、分析等处理。
【 在 xmbba 的大作中提到: 】
: 架构的确不太行。被难住了。请高手支招:)
: 实际上数据量比较大,打底是一个基础线程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的停
: ...................
--
FROM 112.48.103.*
io和高性能无关
--
FROM 125.119.97.*
数据库A和B用的是什么?
【 在 xmbba 的大作中提到: 】
【 在 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 117.129.55.*
加入avx指令?
【 在 xmbba 的大作中提到: 】
: 请高手们帮忙看一下,
: 一个函数,输入xn包含有76657个double数据,经过浮点数除法运算以后输出yn,输出yn是需要有约44960个double数据,yn的结果要push到pStream里面,为了输出到文件或者数据库,需要在0.5s内完成,最好是越快越好。基本的运算方案不能做修改,只能想办法提升效率。目前发现
: 会有卡顿。不知道有没有什么比较极致的提高效率的方法。
: ...................
--
FROM 125.33.201.*
反汇编看看有没有用avx512
【 在 xmbba (bba) 的大作中提到: 】
: 请高手们帮忙看一下,
: 一个函数,输入xn包含有76657个double数据,经过浮点数除法运算以后输出yn,输出yn是需要有约44960个double数据,yn的结果要push到pStream里面,为了输出到文件或者数据库,需要在0.5s内完成,最好是越快越好。基本的运算方案不能做修改,只能想办法提升效率。目前发现
: 会有卡顿。不知道有没有什么比较极致的提高效率的方法。
: 目前可能卡顿在几个地方:
--
FROM 116.147.253.*
不用iostream, 直接printf试试呗
等等你是算一个输出一个? 那必然不行, 时间全耗在io上了.
建个足够大的fifo然后攒多了再输出啊...
【 在 xmbba 的大作中提到: 】
请高手们帮忙看一下,
一个函数,输入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 124.16.158.*
试试claude吧,如果你能把问题描述清楚的话,如果怀疑io的话可以先不做io纯计算看看有没问题
--
FROM 219.142.253.*