C#和C++性能差距巨大,在高耗能和低性能设备上强烈建议不要使用
首先给大家一个声明:
C#和C++性能差距巨大,在高耗能和低性能设备上强烈建议不要使用
首先我使用的设备环境说下
PC端
I5 CPU
4G 内存
WinMoblie
806Mhz CPU
256 内存
这里我将给出原因:
项目 是WINBOLIE 和PC 在线视频医疗的,这里的最复杂的部分无非是WINMOBLIE对PC 和PC对WINMOBLIE的视频音频会话。
项目的开始根据客户要求采用纯C# 编写,先实现了PC端到PC端的语音和视频,顺便做了一个文字聊天,还做了一个视频服务器,能上线下线并支持视频音频转发。
采用了如下技术:
1).采用了业界比较通用的XMPP协议
2).视频用DirectShow.NET做底层,采用H263编码
3).音频用了 LumiSoft.Media.Wave模块,用G711压缩 speex 回音消除
4).网络部分用了UDP的NAT穿透
由于我之前在PC上用C++做过类似的案例,所以做起来比较顺手,10来天就搞定了,运行效果良好,总体比较满意
但是没想到接着就是我的噩梦到来。
接着开始把PC上的程序移植到WINMOBLIE上,首先WINMOBLIE上的.NET框架是.NETCF 和原生.NET框架有一定差距。
接着开始移植
1).DirectShow.NET 是不能直接用了,做了一些修改,花了一点时间基本能用了,但是程序逻辑基本没变
2).LumiSoft.Media.Wave的音频模块移植非常简单 原本调用的 winmm.dll改成winmoblie上的SDK的DLL就可以了。
3).XMPP基本顺利移植
4).网络通信基本没多少改动
到这里可以看出来我程序基本上没多少改动就移植到了WINMOBLIE上,看是很好,可是很悲催的问题出现了
程序性能特别低下!是特别!!!特别的特别!!!卡到基本不能使用!!
后面我被迫把模块一个个单独拉出来去测试然后发现
1).DirectShow.NET 使用的时候CPU 100%(视频)
2).LumiSoft.Media.Wave 使用的时候 CPU 100% (音频)
这是单独使用啊!!!单独使用,是不是很坑爹!!!!!
绝对不是我编程的问题,绝对,我之后可以发一些测试代码上来供大家测试(如果大家兴趣)
接着就是无限制的优化+优化!!!!!而且正对WINMOBLE进行优化!
整整一个星期时间过去,没搞出成果。还是很卡。
接着我开始考虑用C++代替C#的方案,然后用C#调用C++写的视频和音频的DLL
这里是重点:
1).DirectShow.NET 基本采用逻辑不便规则移植到C++上,绝对没有什么逻辑性改进!(也就是按照C#的代码去写C++程序)
2).LumiSoft.Media.Wave 采用基本逻辑不变规则移植到C++上,绝对么有什么逻辑性质改进和优化!
发现C++版重写的的:
1).DirectShow 视频部分 CPU 40%
2).音频部分 CPU 10%
也就是大大满足了要求,性能非常好,任何逻辑改动都没,任何优化都没做!C++立刻完美实现!
最后得到的结论就是
C#和C++性能差距巨大,在高耗能和低性能设备上强烈建议不要使用
如果大家有兴趣我可以发详细对比测试!欢迎大家讨论!