去年举办的每周一练活动,共做了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)。
48