LabVIEW学习笔记 - 算法优化心得体会
去年举办的每周一练活动,共做了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)。
31.73 KB, 下载次数: 71
点赞啊。充分体现了:程序只是个壳,算法才是核心
谢谢,好好学习一下。
下来看看
不错,值得我们这些新人学习!
支持点赞~~~~~~~~~~~去年才刚学, 没出多少力
下下来看看谢谢
赞个!
顶,哈哈,小鹰的心得也是我们获得宝贵经验的捷径,感谢分享
谢谢,好好学习一下。
我们刚学labVIEW,,谢谢
谢谢分享,学习一下
我之前做的跟你的第一种方法差不多,还处在你的初级阶段,哈哈
我们也需要你的分享
我也是碰到问题才改的,平时也是能用就行
好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好
关注经典,收下了!
感觉还不错还没来得及下载
小鹰哥!顶一个!
回帖是一种美德,谢谢大家的支持。
88988888888888888882222222222
22222222222222222222222222222222222222222222222222222222222
马克、、小编好样的。
下来看看,学习一下
111111111111111111111111111111111111111
看看了.呵呵!
我知道这个东西很强大,但是真的不会用啊
好笔记,用不到啊
感谢小编分享,好好学习。
牛掰牛掰牛掰牛掰牛掰
小编威武,小编霸气
就喜欢小编这样的好人
关注经典,收下了!
不错,值得我们这些新人学习
谢谢,可以好好学习一下。
点赞啊。充分体现了:程序只是个壳,算法才是核心
赞
好~ 很享受这个过程...
好评
哇靠,好方法,学习学习啊,收藏了
算法 改进 结构 看来还需要多学习多思考
受用啊 小编好人
贴一个逆运算的(十六进制的字符串转成同样显示HEX字符串),就凑齐了,供需要的人下载吧
小编,你看看这个方法可行吗?
学习学习!
不错,学习了,谢谢
学习下学习下学习下学习下学习下学习下学习下
赞,经典
sdklfsdfs;ldjsad;jgsadljgsldjasdlasd
study up every day study up every day study up every day
谢谢,好好学习一下。