小万LISP 发表于 2019-10-2 11:07:52

三种关闭打开某图层的方法,各执行1万次的结果

今天学习了三种关闭、打开某图层的方法,于是各执行1万次,看看到底哪种更快。
第一种,用时59.586秒

[*](defun c:tt3(/ t0 t1 time)
[*](setvar "CMDECHO" 0)
[*](setq t0 (* 86400 (getvar "tdusrtimer")) )
[*](repeat 10000
[*](command "layer" "off" "2制图_窗型" "")
[*](command "layer" "on" "2制图_窗型" "")
[*])
[*](setq t1 (* 86400 (getvar "tdusrtimer")) )
[*](setq time (- t1 t0))
[*](print time)
[*](princ)
[*])



第二种,用时1.196秒

[*](defun c:tt2(/ t0 t1 time data dxf62 )
[*](setq t0 (* 86400 (getvar "tdusrtimer")) )
[*](repeat 10000
[*](setq data (entget(tblobjname "layer" "2制图_窗型")))
[*](setq dxf62 (cdr (assoc 62 data)));查询图层开/关变量值
[*](setq data (entmod (subst (cons 62 (- dxf62))(assoc 62 data) data)));关闭图层
[*](setq data (entmod (subst (cons 62 dxf62)(assoc 62 data) data)));打开图层
[*])
[*](setq t1 (* 86400 (getvar "tdusrtimer")) )
[*](setq time (- t1 t0))
[*](print time)
[*](princ)
[*])



第三种,用时1.022秒。

[*](defun c:tt1(/ t0 t1 time Ob-layer)
[*](setq t0 (* 86400 (getvar "tdusrtimer")) )
[*](repeat10000
[*](setq Ob-layer (vlax-ename->vla-object(tblobjname "layer" "2制图_窗型")))
[*](vla-put-LayerOn Ob-layer :vlax-false);关闭图层
[*](vla-put-LayerOn Ob-layer :vlax-true)    ;打开图层
[*])
[*](setq t1 (* 86400 (getvar "tdusrtimer")) )
[*](setq time (- t1 t0))
[*](print time)
[*](princ)
[*])



还是有点意思的。

masterlong 发表于 2019-10-2 22:27:00

要真正进行速度测试   不能简单的一个图层开关一万次   而是建立100个图层   每个图层里放置1000个相同的图元   再把代码做到完善最后再进行测试

Andyhon 发表于 2019-10-2 12:23:31

老前辈有叮咛
command 调用耗时 能不用就别用

masterlong 发表于 2019-10-2 22:21:39

不能简单的说command耗时   command命令在运行时其实考虑了很多后续处理   比如说   你用vlax控制图层以后注意一下工具条里的状态是没有变化的所以楼上的vlax代码   相比一个完整的运行过程   其实少了很多步骤   所以才会显得快很多

edata 发表于 2019-10-3 18:40:10

调用command大部分都会比较慢,原则上entmod会更快一些,你的测试时间可能有点问题,vlax次之,command最慢.

Bystander 发表于 2019-10-6 23:17:06

请教大侠用用第三种办法 关图层 怎么样设置支持通配符图层 如*text*

JHX948954875 发表于 2019-10-9 09:33:21

学习了,谢谢楼主分享

Bystander 发表于 2019-10-10 23:01:47

第三种,用时1.022秒。
(defun c:tt1(/ t0 t1 time Ob-layer)
(setq t0 (* 86400 (getvar "tdusrtimer")) )
(repeat10000
(setq Ob-layer (vlax-ename->vla-object(tblobjname "layer" "2制图_窗型")))
(vla-put-LayerOn Ob-layer :vlax-false);关闭图层
(vla-put-LayerOn Ob-layer :vlax-true)    ;打开图层
)
(setq t1 (* 86400 (getvar "tdusrtimer")) )
(setq time (- t1 t0))
(print time)
(princ)
)


大神 请教 怎么样参照这个方法关闭多个图层如text1text2text3   1clou12clou2
是否可以支持通配符如*text*   *clou*

gzcsun 发表于 2024-1-29 16:45:52

觉得最慢comman<vl-cmdf<entmod<vlax最快。cad版本越高越明显。
就算最慢comman开关多个图层几次时间也是很少很少忽略不计。
不过在不影响速度情况下尽量用command会好用的。

magicheno 发表于 2024-1-29 23:16:37

感谢大佬分享
页: [1]
查看完整版本: 三种关闭打开某图层的方法,各执行1万次的结果