立即注册 登录
晓东CAD家园-论坛 返回首页

eachy的个人空间 http://bbs.xdcad.net/?14 [收藏] [复制] [分享] [RSS]

日志

写程序中的一个测试

已有 735 次阅读2013-5-6 18:10 |个人分类:Lisp

程序:曲线选择集交点断开

代码:

(defun get-utime () (* 86400.0 (getvar "tdusrtimer")))
(defun c:tt (/ ss t1 i t2 t3 t4 t5 el ol ool)
(if (setq ss (ssget))
(progn
(setq t1 (get-utime))
(setq ssl (sslength ss)
i -1
)
(repeat ssl
(setq el (cons (ssname ss (setq i (1+ i))) el))
)
(princ "\nRepeat Use Time ")
(princ (- (setq t2 (get-utime)) t1))
(princ " s")
(vlax-for obj (vla-get-activeselectionset
(vla-get-activedocument (vlax-get-acad-object))
)
(setq ol (cons obj ol))
)
(princ "\nVlax-for Use Time ")
(princ (- (setq t3 (get-utime)) t2))
(princ " s")
(mapcar 'vlax-ename->vla-object el)
(princ "\nEntity Convert Use Time ")
(princ (- (setq t4 (get-utime)) t3))
(princ " s")
(mapcar 'vlax-vla-object->ename ol)
(princ "\nObject Convert Use time ")
(princ (- (setq t5 (get-utime)) t4))
(princ " s")
(setq i -1)
(repeat ssl
(setq ool
(cons (vlax-ename->vla-object (ssname ss (setq i (1+ i))))
ool
)
)
)
(princ "\nRepeat + Convert Use Time ")
(princ (- (get-utime) t5))
(princ " s")
)
)
(princ)
)
;|
运行前关闭 Vlisp 编辑器,否则会降低程序运行效率
命令: tt
选择对象: 指定对角点: 找到 20000 个

选择对象:

Repeat Use Time 0.04 s
Vlax-for Use Time 0.251 s
Entity Convert Use Time 0.651 s
Object Convert Use time 0.29 s
Repeat + Convert Use Time 0.671 s
|;
(defun c:t1 (/ ss ssl i el el0 e1 e2 ptl pts t1 t2)
(if (setq ss (ssget )
ssl (sslength ss)
i -1
)
(progn
(setq t1 (get-utime))
(repeat ssl
(setq
el
(cons (vlax-ename->vla-object (ssname ss (setq i (1+ i))))
el
)
)
) ;_直接构造Object 列表可以避免在 while 中的多次转换,vlax-ename->vla-object 要比
;;vlax-vla-object->ename 多费些时间
(princ "\nRepeat Use time ")
(princ (- (setq t2 (get-utime)) t1))
(princ " s!")
;;前面先获取Object列表, 不管用什么方面都是秒以内的事
;;如果直接在 repeat 内部 ssname + vlax-ename->vla-object 作的重复转换就大大增加了
(while el
(setq e1 (car el)
el (cdr el)
el0 el
)
(while el0
(setq e2 (car el0)
el0 (cdr el0)
pts (vlax-invoke e2 'intersectwith e1 acextendnone)
;;pts (safearray-value (variant-value (vla-intersectwith e1 e2 acextendnone)))
)
(if pts
(while pts
(setq ptl (cons (list (car pts) (cadr pts) (caddr pts)) ptl)
pts (cdddr pts)
)
)
)
)
)
(princ "\nGetinters Use time ")
(princ (- (get-utime) t2))
(princ " s!")
(princ "\nInters Numbers = ")
(princ (length ptl))
)
)
(princ)
)
;|
在没有交点的情况下,两两实体要 intersectwith

测试目的:实体数量对程序运行效率的影响

命令: t1
选择对象: 指定对角点: 找到 300 个

选择对象:

Repeat Use time 0.04 s!
Getinters Use time 1.131 s!
Inters Numbers = 0

命令:
命令: t1
选择对象: 指定对角点: 找到 600 个

选择对象:

Repeat Use time 0.061 s!
Getinters Use time 3.785 s!
Inters Numbers = 0

命令:
命令: T1
选择对象: 指定对角点: 找到 820 个

选择对象:
Repeat Use time 0.06 s!
Getinters Use time 6.85 s!
Inters Numbers = 0

命令: t1
选择对象: 指定对角点: 找到 1720 个

选择对象:

Repeat Use time 0.15 s!
Getinters Use time 51.534 s!
Inters Numbers = 0

使用 (safearray-value (variant-value (vla-intersectwith o1 o2 acextendnone)))
测试比 vlax-invoke 要慢一些

命令: t1
选择对象: 指定对角点: 找到 1720 个

选择对象:

Repeat Use time 0.201 s!
Getinters Use time 67.457 s!
Inters Numbers = 0

命令: t1
选择对象: 指定对角点: 找到 200 个

选择对象:

Repeat Use time 0.03 s!
Getinters Use time 0.901 s!
Inters Numbers = 10000

|;

;;可以看出选择集实体实体数量的多少对求交点的效率有着直接的影响
;;Lisp 可以通过算法的优化提高运行效率,但是有些制约因素是不能回避的
;;具体使用中要灵活运用,比如求交点,不要一次选择太多,分区域选择执行
;;程序将有更高的效率

路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-28 02:34 , Processed in 0.231230 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部