C#大数据量处理性能优化?

SSticker 2017-10-11 10:51:03
问题是这样的,我通过UDP接收硬件图像数据,然后开了3个Task,分别用于图像数据的接收,图像处理,显示。因为图像需要实时接收,所有3个线程里都用while循环,且相互关联(使用标志位一个线程处理完成进入下一个)。每帧图像的数据我是放在一个384*288的byte大数组里,图像处理时调用了emgucv的库,使用的是WPF框架(初学)。

整个程序在正常成像的情况下(不加入图像处理)内存占用大约200M,CPU使用率达到70%,帧率15帧每秒。当调用图像处理部分时,CPU基本达到90%。在台式机上还行,有卡顿,在一般笔记本上估计就跑不了了。

感觉就是框架可以搭建优化什么的就太吃力,C#大数组循环处理的过程中有什么提高性能的方法吗?
...全文
759 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
SSticker 2017-10-15
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
接收数据之后,如果以要异步处理,直接写(例如)
ThreadPool.QueueUserWorkItem(h =>
{
    //这里的代码可以使用匿名委托外边的变量
});
就行了!纠结什么“3个线程”干什么呢?所谓“图像处理线程、显示线程”都是多余的东西。 而实际上,接收操作应该使用异步接收模式,当有数据到来时 .net 会自动使用 I/O 线程来调用你注册的异步回调,你用不着写什么“死循环+阻塞”代码。
能否再详细说一下异步接收模式?
SSticker 2017-10-14
  • 打赏
  • 举报
回复
引用 2 楼 ayouxinping的回复:
cpu那么高,代表你有死循环啦,一般数据大,是内存占有比重大,最好检查一下代码。
我把后两个线程用spinwait进行休眠操作之后cpu好了很多,因为要实时接收图像数据并显示,所以写成死循环。我用ants memory profile测试了内存,发现非托管的占用比较多
SSticker 2017-10-14
  • 打赏
  • 举报
回复
引用 1 楼 clark_kidd的回复:
我认为你用while是有问题的
嗯,我把后两个线程用spinwait进行休眠操作之后cpu好了很多
苍穹无痕 2017-10-11
  • 打赏
  • 举报
回复
cpu那么高,代表你有死循环啦,一般数据大,是内存占有比重大,最好检查一下代码。
  • 打赏
  • 举报
回复
接收数据之后,如果以要异步处理,直接写(例如)
ThreadPool.QueueUserWorkItem(h =>
{
    //这里的代码可以使用匿名委托外边的变量
});
就行了!纠结什么“3个线程”干什么呢?所谓“图像处理线程、显示线程”都是多余的东西。 而实际上,接收操作应该使用异步接收模式,当有数据到来时 .net 会自动使用 I/O 线程来调用你注册的异步回调,你用不着写什么“死循环+阻塞”代码。
clark_kidd 2017-10-11
  • 打赏
  • 举报
回复
我认为你用while是有问题的

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧