先介绍下背景:
大约3年以前开始使用SNMP++,去年由于上层是C#、C++调试麻烦等问题,转向其他snmp库,比对了SNMP++,NetSnmp和SnmpSharpNet,最终因为SnmpSharpNet用起来的方便就选了它,随后逐渐完善了自己负责的软件的相应数据访问层。
去年另一个项目的软件仍使用snmp++的库,并且重编译过(可能进行了某些改动),该软件的目标之一是替代我现在使用的软件!天哪,我不允许替代我的软件的代码性能低于我,所以做了下效率的测试。
测试数据在公司...很遗憾这里列不出来了...
测试环境:
PC网卡直连设备(这个设备是我们自己的产品,嵌入式SNMP部分使用Agent++)
使用Wildpackets Etherpeek直接抓包测试。
使用C++编写测试程序,调用snmp_pp.dll,Get设备object id 10次。
使用C#编写测试程序,调用snmpsharpnet.dll,Get设备object id 10次。
测试程序均为release编译。
测试结果:
C++情况下第一个完整GET操作好事0.047s,C#为0.0468
随后的时间均短一些,但C#的timetick居然在多次循环中存在数值为0!即第一个GET0.0468,第二个0,第三个0,第四个非0的数值...不明白为什么,所以采用抓包工具进行更客观的测试。
结果显示,C#情况下第一个Get的Request包和最后一个Response包的时间间隔约为0.3s,C++情况下在1.4-1.5s之间。
注意到当时C++情况下命令行有打印一些其他信息,故在snmp_pp源码中删除打印信息的语句,重新测试,时间在1.3s左右。
测试GetNext操作,数据和Get基本相同。
(我注意了下数据包中的源端口,C++和C#都是每包+1,也就是自动以下一个可用端口作为源端口)
据说CLR在数据库、Socket、文件处理方面比C++强,这个我没测试过,不过现在在SNMP的基本库来看,还是SNMPSharpNet高一筹。
所以...我还是用SnmpSharpNet吧