完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛
|
去年举办的每周一练活动,共做了4个游戏,“撑竹竿过河”、“24点”、“2048”、“黑白棋”,得到了广大发烧友的支持并参与其中;但是随着时间的推移,大家的积极性也随之降温,参赛作品一次比一次少,因此labview益智游戏的活动先暂停,但是每周一练不能停,我会将我的学习心得写出来,以供大家参考学习;同时也欢迎读者斧正点评。 *************************************************************************** 一直在做一个项目,已经写了差不多4个月了,也积累了很多心得体会,后续我会将我在写程序碰到的一些问题写出来,一是强化自身记忆,二是供大家参考,少走弯路。 最近碰到一个问题,有一个需求,需要将字符串转为16进制字符串,如图所示:
左边是字符串显示,右边是16进制显示,不知读者有何高招,不妨先自己动手写个程序,再往下看! *************************************************************************** 这个算法以前就做个,以下简称算法1,就直接用了,如下图所示:
简单描述下该算法,就是每次索引前2个字符,如1A,然后十六进制字符串转数值为0x1A,再强制类型转换为字符串,最后创建数组,完成。 这个算法是可以实现该需求的,但是后来使用的时候却很卡,分析原因是因为当数据量过大时,比如5M,10M的数据量,转换一次就得要几秒的时间,严重影响程序的流畅性。写测试程序分析改进,首先创建一个2M(16进制的数据量)的数据,
算法1的耗时如下图所示:
平均用时为646ms; *************************************************************************** 那么该如何修改??? 仔细一看,原来这里用了创建数组,用创建数组的时候,每次运行之后,都需要重新分配数组内存的大小,如果运行For循环前,提前分配数组大小,那运行效率将会提高,程序框图如下:
以下简称算法2,运行时间如下图所示:
平均时间为155ms,效率明显上来了。 ********************************************************************************** 那么问题来了,这个算法还有没有优化空间呢? 请读者先思考片刻,在往下看。 。 。。 。。。 。。。。 。。。。。 。。。。。。 。。。。。。。。 。。。。。。。。。 。。。。。。。。。。 ********************************************************************************** 第二天中午睡觉的时候,迷迷糊糊的想着这个问题,脑海里突然蹦出一句话,“节省时间,牺牲空间”(充分证明午休的重要性),从这句话来看,显得很空洞,没啥实质性的建议,看下图就会明白了,首先,创建一个数组
程序框图如下:
上图简称算法3,比如我们需要将字符串1A转为16进制1A,首先将字符串转数组,然后抽取一维数组为1(ox31)和A(0x41),在减去48(0x30)转为数值,在1为高4字节,A为低4字节,最后拼接起来,完成; 测试效果如下图所示:
平均时间为44ms,效率明显又得到进一步提升。。。。。。。。 ********************************************************************************** 程序写到这一步,貌似已将到顶了,已经无法改进了,但是仔细再看看算法3,仍有提升空间,比如减去48见可以省去,那就是需要创建这么一个数组:
01234……从第48个元素开始,前面填充0,这样就可以省去2000000次减法了,程序框图如下图所示:
测试效果如下:
平均用时为28ms,效率又提升了一大步,看到上图的程序框图,我觉得已经简无可简了。 ********************************************************************************** 后来又观察乘16其实可以看作向左移4位,想起了以前学单片机的时候,老师讲过在计算机中,逻辑运算是计算机最容易的,最快的,于是又改为如下程序框图:
“乘加”换成了“移位”和“与运算”,测试效果如下图所示:
平均耗时为27.6ms,效率与之前的差不多,没有得到明显提升,应该是对于电脑的CPU来说,这里体现不出来,如果是单片机的话,我认为会有明显区别(希望有读者看到可以试试,看看效率差多少)。 ************************************************************************* 写到这里,已经终结了,改进了这么多次的算法,使我感受到了什么叫做“没有最好,只有更好”,写程序也需要多观察,多思考,多总结;当我们总结大量的经验后,就能够更快、更准、更好的完成程序,节省开发周期。 如果读者认为该算法仍有提升空间,迫切希望回帖切磋交流。附件为测试程序。 ************************************************************************* 这个转换的逆运算就留给读者自己动手做了。 ****************************** 完结-20160228 ************************** 下期看点:波形图的秘密(1)。
|
|
相关推荐
58 个讨论
|
|
|
谢谢,好好学习一下。
|
|
|
|
|
|
|
|
|
下来看看
|
|
|
|
|
|
|
|
|
顶,哈哈,小鹰的心得也是我们获得宝贵经验的捷径,感谢分享
|
|
|
|
|
|
|
|
|
谢谢,好好学习一下。
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
有没有大佬知道labview中使用Halcon拍照算子采集图像后,如何把图像传入调用的Halcon算子?
4589 浏览 0 评论
LabVIEW对51单片机电压的采集,用VISA写入函数发送字符串voltage,VISA读取函数也是字符串?
2353 浏览 1 评论
2057 浏览 0 评论
7655 浏览 1 评论
2724 浏览 0 评论
4741浏览 0评论
有没有大佬知道labview中使用Halcon拍照算子采集图像后,如何把图像传入调用的Halcon算子?
4589浏览 0评论
5218浏览 0评论
5158浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 21:33 , Processed in 1.756568 second(s), Total 84, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3954