小板凳性能改进以及菜鸟写lisp的一些教训

2019年6月30日      作者:Jack Hsu

上个月做出来的几个小板凳,确实是非常非常初级的小板凳版的小板凳,问题非常地多。在请教了一些高手,自己再次看了几遍教材,再次花时间查看手册之后,算是找到了一点可行的改进方案,试验之后,小板凳之一的性能终于正常了。

那个性能得到改进的小板凳,功能非常简单,就是对基坑工程中的内支撑做尺寸标注,不是使用cad自带的尺寸功能标注,而是在特定的位置作1个单行文字即可。具体应用场景是这样的,某个dxf或dwg图纸中,有很多的直线,这些直线有的相交有的不相交,需求就是在选中这些直线之后,能够自动找出交点、计算出相邻2个交点(或交点与直线端点)的长度,并把这个长度以文字形式在图形里边写出来。

这个功能需求的实现,其实有好多个现成的版本,网上可以搜索出来一些信息,有人在实现这个功能的同时,还是实现了同济启明星那样的自动画支撑轮廓的功能,以及自动布置立柱桩功能。我的那个小板凳,增加一些代码也是可以自动布置立柱桩的,只是自动画轮廓的功能还没动手去实现,现在不确定算法实现出来的性能是否能让人接受。

小板凳的性能改进经历了几个阶段,在查阅资料、对比几种实现方式之后,可以观察到明显的性能差异。对于400+直线,需要标注的线段(2个交点或者交点与端点间算作1个线段)在800+时,使用autolisp的command函数,以text方式写文字,大约需要50s左右;改用visual lisp的vl-cmdf函数之后,大约需要40s左右,性能有了20%-30%的提升;后来,在使用activex接口的vla方法之后,只需要4s左右,耗时降低了1个数量级,鸟枪换炮了,性能有了质的飞跃。

实现方法(函数) 耗时(秒) 备注
(command "-text" ) ~50 autolisp
(vl-cmdf "-text" )
~40 visual lisp
(vla-AddText) ~4 ActiveX

最后,请教了一些高手,又仔细研究学习了一些大咖的代码之后,在再次审视自己的小板凳之后,发现了问题所在,在删除了循环体内的几行无关紧要、多余的判断和操作之后,上述操作的耗时直接到了1s以内,至此,性能终于符合预期了。当然了,对于长期需要在投标时提供两三个解决方案的人来说,肯定是还要再次对比一下autocad的几种的接口的性能的,对比的结果依然是activex接口性能>visuallisp接口>autolisp接口,定量的数据大概是0.3s、0.4s、超过0.5s。最后的最后,做了一下压力测试,编译为vlx之后,2倍的上述模型时,800+直线、1600+线段,耗时0.8s左右,5倍的上述模型时,2000+直线、4000+线段,耗时3.7s左右。

模型 耗时(秒) 实现方法(函数)
直线400+,线段800+ ~0.4 (vla-AddText),vlx脚本
直线800+,线段1600+ ~0.8 (vla-AddText),vlx脚本
直线2000+,线段4000+ ~3.7 (vla-AddText),vlx脚本

很多前辈、高人都讲过,代码某种程度上就是调试出来,而不是编写出来的。这个理念很重要,几乎所有事情都是这样,不亲自动手很难发现问题,更不用提理解别人的现成的解决方案了。作为菜鸟,写autocad的lisp脚本,也发现了很多的坑,得到了不少教训,可能有些还不单是lisp独有的。主要的教训有几个,一是一定要关掉捕捉,手动关掉或者在功能代码之前用语句关掉,二是调试通过之后再关掉cmdecho,原因是command函数执行某些内置命令时与命令参考手册里边的说明有些差异,关了cmdecho没法发现错误信息,三是不要在循环体内执行一些无关操作,否则引起的性能损失会大到无法想象,四是纯数学运算、纯表操作耗时可能比设置autocad的系统变量、环境变量低一两个数量级,分离这两部分代码,有助于发现并解决性能问题,五是有了算法才能解决问题,而不是靠写代码的技巧。

附图是我那个支撑标注的cad插件的运行录像。

支撑标注演示33.gif

标签: 图纸 cad 支撑 lisp 标注 插件

评论:

WRZ
2019-07-05 14:45
走到哪里 都能看到大佬 你说的这些东西 我第一次听 去查查!
Jack Hsu
2019-07-08 09:35
@WRZ:嗯,深有同感,现在大佬很多,到处都有交流的机会,我就是逮着机会跟大佬请教了一些问题,得到了不少的启发。

发表评论:

Copyright© 2009-2019 95ie.com. All Rights Reserved.
powered by emlog