找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1655|回复: 3

[每日一码] 不遍历选择集到实体表的代码及各种遍历方法效率的比较

[复制链接]

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-3-30 00:30:17 | 显示全部楼层 |阅读模式

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

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

×
不遍历选择集获得实体表的方法

第一个代码:
  1. (defun ss->ents (ss)
  2.   (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
  3. )



命令: (ss->ents ss)
(<图元名: -bea4e8> <图元名: -24db50> <图元名: -24db68> <图元名: -24db80>)



第二个代码:


通常的遍历选择集的代码

  1. (defun ss->ents1 (ss)
  2.   (setq i (sslength ss))
  3.   (repeat i
  4.     (setq ents (cons (ssname ss (setq i (1- i))) ents))
  5.   )
  6. )



命令: (ss->ents1 ss)
(<图元名: -bea4e8> <图元名: -24db50> <图元名: -24db68> <图元名: -24db80>)


上面哪个效率高呢? 测试下,18000个实体
测试代码:
  1. (defun c:tt ()
  2.   (setq ss (ssget "x"))
  3.   (setq ti (car (_vl-times)))
  4.   (setq a (ss->ents ss))
  5.   (prompt (strcat "\n实体数:" (itoa (length a)) "...Elapsed time : "))
  6.   (princ (rtos (/ (- (car (_vl-times)) ti) 1000.0) 2 50))
  7.   (setq ti (car (_vl-times)))
  8.   (setq a (ss->ents1 ss))
  9.   (prompt (strcat "\n实体数:" (itoa (length a)) "...Elapsed time : "))
  10.   (princ (rtos (/ (- (car (_vl-times)) ti) 1000.0) 2 50))
  11.   (princ)
  12. )


命令: tt

实体数:18000...Elapsed time : 0.079
实体数:18000...Elapsed time : 0.015

命令:
命令: tt

实体数:18000...Elapsed time : 0.078
实体数:18000...Elapsed time : 0.016

命令:
命令: tt

实体数:18000...Elapsed time : 0.078
实体数:18000...Elapsed time : 0.016


测试结果: 第二个代码效率要高的多

==============================


那么,遍历选择集从头开始,和从末尾往前哪个效率高呢?
第一种代码,从前往后遍历
  1. (defun ss->ents1 (ss / i ents)
  2.   (setq len (sslength ss) i -1)
  3.   (repeat len
  4.     (setq ents (cons (ssname ss (setq i (1+ i))) ents))
  5.   )
  6.   (reverse ents)
  7. )



第二种代码,从末尾往前遍历,少了一个reverse的操作。
  1. (defun ss->ents2 (ss)
  2.   (setq i (sslength ss))
  3.   (repeat i
  4.     (setq ents (cons (ssname ss (setq i (1- i))) ents))
  5.   )
  6. )



测试代码:
  1. (defun c:tt ()
  2.   (setq ss (ssget "x"))
  3.   (setq ti (car (_vl-times)))
  4.   (setq a (ss->ents1 ss))
  5.   (prompt (strcat "\n实体数:" (itoa (length a)) "...Elapsed time : "))
  6.   (princ (rtos (/ (- (car (_vl-times)) ti) 1000.0) 2 50))
  7.   (setq ti (car (_vl-times)))
  8.   (setq a (ss->ents2 ss))
  9.   (prompt (strcat "\n实体数:" (itoa (length a)) "...Elapsed time : "))
  10.   (princ (rtos (/ (- (car (_vl-times)) ti) 1000.0) 2 50))
  11.   (princ)
  12. )


测试结果:
命令: tt

实体数:18000...Elapsed time : 0.04699999999999999
实体数:18000...Elapsed time : 0.015

命令:
命令: tt

实体数:18000...Elapsed time : 0.015
实体数:18000...Elapsed time : 0.016

命令:
命令: tt

实体数:18000...Elapsed time : 0.016
实体数:18000...Elapsed time : 0.015

命令:
命令: tt

实体数:18000...Elapsed time : 0.015
实体数:18000...Elapsed time : 0.016

命令:
命令: tt

实体数:18000...Elapsed time : 0.016
实体数:18000...Elapsed time : 0.015

命令:
命令: tt

实体数:18000...Elapsed time : 0.016
实体数:18000...Elapsed time : 0.015

命令:
命令: tt

实体数:18000...Elapsed time : 0.016
实体数:18000...Elapsed time : 0.015

命令:
命令: tt

实体数:18000...Elapsed time : 0.04699999999999999
实体数:18000...Elapsed time : 0.015


表明: 从前往后遍历和 从后往前遍历选择集得到实体表,效率基本相同。从前往后遍历不会因为多一个reverse操作减慢多少。这个可以说明从后往前遍历选集,ssname 这个效率比从前往后顺序来要耗费多些时间,平衡了reverse的耗费。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6056个

财富等级: 富甲天下

发表于 2017-3-31 00:03:40 | 显示全部楼层
啥也不说了,感谢楼主分享哇!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2017-3-31 00:35:31 | 显示全部楼层
本帖最后由 yxpxa 于 2017-3-31 00:40 编辑

精彩! 正需要这方面的内容。
有没有试试 while 循环,众所周知, while 比 repeat 效率高。
  1. (setq n 0 sL '())
  2. (while (setq en (ssname ss n)) (setq n (1+ n) sL (cons en sL)))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 862个

财富等级: 财运亨通

发表于 2017-3-31 08:05:36 | 显示全部楼层
啥也不说了,感谢楼主分享哇!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-12 10:45 , Processed in 0.345861 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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