找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2078|回复: 4

[研讨] 关于曲线交点打断的程序效率测试

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-7-9 00:33:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
程序:曲线选择集交点断开
  1. (defun get-utime () (* 86400.0 (getvar "tdusrtimer")))
  2. (defun c:tt (/ ss t1 i t2 t3 t4 t5 el ol ool)
  3.   (if (setq ss (ssget))
  4.     (progn
  5.       (setq t1 (get-utime))
  6.       (setq ssl        (sslength ss)
  7.             i        -1
  8.       )
  9.       (repeat ssl
  10.         (setq el (cons (ssname ss (setq i (1+ i))) el))
  11.       )
  12.       (princ "\nRepeat Use Time ")
  13.       (princ (- (setq t2 (get-utime)) t1))
  14.       (princ " s")
  15.       (vlax-for        obj (vla-get-activeselectionset
  16.                       (vla-get-activedocument (vlax-get-acad-object))
  17.                     )
  18.         (setq ol (cons obj ol))
  19.       )
  20.       (princ "\nVlax-for Use Time ")
  21.       (princ (- (setq t3 (get-utime)) t2))
  22.       (princ " s")
  23.       (mapcar 'vlax-ename->vla-object el)
  24.       (princ "\nEntity Convert Use Time ")
  25.       (princ (- (setq t4 (get-utime)) t3))
  26.       (princ " s")
  27.       (mapcar 'vlax-vla-object->ename ol)
  28.       (princ "\nObject Convert Use time ")
  29.       (princ (- (setq t5 (get-utime)) t4))
  30.       (princ " s")
  31.       (setq i -1)
  32.       (repeat ssl
  33.         (setq ool
  34.                (cons (vlax-ename->vla-object (ssname ss (setq i (1+ i))))
  35.                      ool
  36.                )
  37.         )
  38.       )
  39.       (princ "\nRepeat + Convert Use Time ")
  40.       (princ (- (get-utime) t5))
  41.       (princ " s")
  42.     )
  43.   )
  44.   (princ)
  45. )
  46. ;|
  47. 运行前关闭 Vlisp 编辑器,否则会降低程序运行效率
  48. 命令: tt
  49. 选择对象: 指定对角点: 找到 20000 个

  50. 选择对象:

  51. Repeat Use Time 0.04 s
  52. Vlax-for Use Time 0.251 s
  53. Entity Convert Use Time 0.651 s
  54. Object Convert Use time 0.29 s
  55. Repeat + Convert Use Time 0.671 s
  56. |;
  57. (defun c:t1 (/ ss ssl i el el0 e1 e2 ptl pts t1 t2)
  58.   (if (setq ss (ssget )
  59.             ssl        (sslength ss)
  60.             i        -1
  61.       )
  62.     (progn
  63.       (setq t1 (get-utime))
  64.       (repeat ssl
  65.         (setq
  66.           el
  67.            (cons (vlax-ename->vla-object (ssname ss (setq i (1+ i))))
  68.                  el
  69.            )
  70.         )
  71.       ) ;_直接构造Object 列表可以避免在 while 中的多次转换,vlax-ename->vla-object 要比
  72.       ;;vlax-vla-object->ename 多费些时间
  73.       (princ "\nRepeat Use time ")
  74.       (princ (- (setq t2 (get-utime)) t1))
  75.       (princ " s!")
  76.       ;;前面先获取Object列表, 不管用什么方面都是秒以内的事
  77.       ;;如果直接在 repeat 内部 ssname + vlax-ename->vla-object 作的重复转换就大大增加了
  78.       (while el
  79.         (setq e1  (car el)
  80.               el  (cdr el)
  81.               el0 el
  82.         )
  83.         (while el0
  84.           (setq        e2  (car el0)
  85.                 el0 (cdr el0)
  86.                 pts (vlax-invoke e2 'intersectwith e1 acextendnone)
  87.                 ;;pts (safearray-value (variant-value (vla-intersectwith e1 e2 acextendnone)))
  88.           )
  89.           (if pts
  90.             (while pts
  91.               (setq ptl        (cons (list (car pts) (cadr pts) (caddr pts)) ptl)
  92.                     pts        (cdddr pts)
  93.               )
  94.             )
  95.           )
  96.         )
  97.       )
  98.       (princ "\nGetinters Use time ")
  99.       (princ (- (get-utime) t2))
  100.       (princ " s!")
  101.       (princ "\nInters Numbers = ")
  102.       (princ (length ptl))
  103.     )
  104.   )
  105.   (princ)
  106. )
  107. ;|
  108. 在没有交点的情况下,两两实体要 intersectwith

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

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

  112. 选择对象:

  113. Repeat Use time 0.04 s!
  114. Getinters Use time 1.131 s!
  115. Inters Numbers = 0

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

  119. 选择对象:

  120. Repeat Use time 0.061 s!
  121. Getinters Use time 3.785 s!
  122. Inters Numbers = 0

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

  126. 选择对象:
  127. Repeat Use time 0.06 s!
  128. Getinters Use time 6.85 s!
  129. Inters Numbers = 0

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

  132. 选择对象:

  133. Repeat Use time 0.15 s!
  134. Getinters Use time 51.534 s!
  135. Inters Numbers = 0

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

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

  140. 选择对象:

  141. Repeat Use time 0.201 s!
  142. Getinters Use time 67.457 s!
  143. Inters Numbers = 0

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

  146. 选择对象:

  147. Repeat Use time 0.03 s!
  148. Getinters Use time 0.901 s!
  149. Inters Numbers = 10000

  150. |;

  151. ;;可以看出选择集实体实体数量的多少对求交点的效率有着直接的影响
  152. ;;Lisp 可以通过算法的优化提高运行效率,但是有些制约因素是不能回避的
  153. ;;具体使用中要灵活运用,比如求交点,不要一次选择太多,分区域选择执行
  154. ;;程序将有更高的效率
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-7-9 07:40:41 | 显示全部楼层
假如是2n个实体的话,两两求交的时候得(2n-1)(2n-2)
而若分两批来分别打断的时候,是2*((n-1)*(n-2))
大概会有一倍时间差别。
突然想到,选的时候可以全选,能否在求交的时候人为的来按照分区域计算呢。
记得在开始用lisp的时候编横线与竖线求交的时候。曾经用先选横线,再选竖线的方法来构建交点集,便快的多,但是没有通用性。
最近看线线(直线)相交的算法,经常采用排序法进行判断之后,求交的速度变快的多。
不知道lisp中求线面相交和面面相交有什么好方法。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2006-7-9 08:14:18 | 显示全部楼层
200  个实体 ---〉 1s
600  个实体 ---〉 4s
820  个实体 ---〉 7s
1720个实体 ---〉67s

不是一个倍数的关系。还有Lisp 用的表,在长度很长的表中检索也是一个费时的做法(比如消重实体,简单的写法就是将 DXF 构造一个个表然后 比较),这样的应用也要分区域处理才高效
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-7-15 13:09:18 | 显示全部楼层
前两天在网上下载了qbrick.arx的06.6月修改版
在我机器上大概是2~3秒完成这个100*100的交线打断操作

acadx的arx在我这里加载不了,不知道它对应什么版本的cad,,所以它的cut打断没有办法测试
xdapi的批量打断没有找到

不知道arx的效率和lsp的效率在打断实体方面的差别有几倍的差距呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2006-7-15 17:39:54 | 显示全部楼层
最初由 snoopychen 发布
[B]前两天在网上下载了qbrick.arx的06.6月修改版
在我机器上大概是2~3秒完成这个100*100的交线打断操作

acadx的arx在我这里加载不了,不知道它对应什么版本的cad,,所以它的cut打断没有办法测试
xdapi的批量打断没有... [/B]

Arx 的高效率和强大功能是毋庸置疑的,但是受版本限制实在不爽。一般应用Lisp和Arx效率的差异可以忽略。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-5 14:01 , Processed in 0.212474 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表