本帖最后由 fangmin723 于 2024-6-26 16:45 编辑
- (defun c:test(/ en enlst ent etime info n ss stime)
- (setq ss (ssget) info "\n---取3次测试结果,十万个圆:\nGG1处理:" i 0)
- (repeat 3;;GG1
- (princ (strcat "\nGG1第 " (rtos (setq i (1+ i))) " 次处理!"))
- (setq stime (getvar "MILLISECS"))
- (setq enlst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
- (setq etime (getvar "MILLISECS"))
- (setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
- )
- (setq info (strcat info "\nGG2处理:") i 0)
- (repeat 3;;GG2
- (princ (strcat "\nGG2第 " (rtos (setq i (1+ i))) " 次处理!"))
- (setq stime (getvar "MILLISECS"))
- (setq enlst (mapcar 'cadr (cdr (reverse (ssnamex ss)))))
- (setq etime (getvar "MILLISECS"))
- (setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
- )
- (setq info (strcat info "\nGG3处理:") i 0)
- (repeat 3;;GG3
- (princ (strcat "\nGG3第 " (rtos (setq i (1+ i))) " 次处理!"))
- (setq stime (getvar "MILLISECS"))
- (setq enlst nil)
- (repeat(setq n (sslength ss))
- (setq en(ssname ss (setq n(1- n))))
- (setq enlst(cons en enlst))
- )
- (setq etime (getvar "MILLISECS"))
- (setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
- )
- (setq info (strcat info "\nGG4处理:") i 0)
- (repeat 3;;GG4
- (princ (strcat "\nGG4第 " (rtos (setq i (1+ i))) " 次处理!"))
- (setq stime (getvar "MILLISECS"))
- (setq enlst nil n -1)
- (while (setq ent (ssname ss (setq n (1+ n))))
- (setq enlst(cons ent enlst))
- )
- (setq etime (getvar "MILLISECS"))
- (setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
- )
- (setq info (strcat info "\nGG5处理:") i 0)
- (repeat 3;;GG5
- (princ (strcat "\nGG5第 " (rtos (setq i (1+ i))) " 次处理!"))
- (setq stime (getvar "MILLISECS"))
- (setq enlst (vl-remove-if-not '(lambda (arg) (equal (type arg) 'ENAME)) (mapcar 'cadr (ssnamex SS))))
- (setq etime (getvar "MILLISECS"))
- (setq info (strcat info "耗时:" (rtos (- etime stime) 2 0)" ms;"))
- )
- (princ info)
- (princ)
- )
测试环境:中望CAD2025
命令: TEST
选择对象:
指定对角点:
找到 100000 个
选择对象:
GG1第 1 次处理!
GG1第 2 次处理!
GG1第 3 次处理!
GG2第 1 次处理!
GG2第 2 次处理!
GG2第 3 次处理!
GG3第 1 次处理!
GG3第 2 次处理!
GG3第 3 次处理!
GG4第 1 次处理!
GG4第 2 次处理!
GG4第 3 次处理!
GG5第 1 次处理!
GG5第 2 次处理!
GG5第 3 次处理!
---取3次测试结果,十万个圆:
GG1处理:耗时:625 ms;耗时:734 ms;耗时:656 ms;
GG2处理:耗时:656 ms;耗时:641 ms;耗时:656 ms;
GG3处理:耗时:94 ms;耗时:62 ms;耗时:78 ms;
GG4处理:耗时:79 ms;耗时:62 ms;耗时:63 ms;while+ssname 最优
GG5处理:耗时:7687 ms;耗时:8969 ms;耗时:9172 ms;
还是用
(setq enlst nil n -1)
(while (setq ent (ssname ss (setq n (1+ n))))
(setq enlst (cons ent enlst))
)
吧,比repeat都快!!!
命令: TEST
选择对象:
指定对角点:
找到 1000000 个
选择对象:
GG1第 1 次处理!
GG1第 2 次处理!
GG1第 3 次处理!
GG2第 1 次处理!
GG2第 2 次处理!
GG2第 3 次处理!
GG3第 1 次处理!
GG3第 2 次处理!
GG3第 3 次处理!
GG4第 1 次处理!
GG4第 2 次处理!
GG4第 3 次处理!
GG5第 1 次处理!
GG5第 2 次处理!
GG5第 3 次处理!
---取3次测试结果,一百万个圆:
GG1处理:耗时:130390 ms;耗时:118953 ms;耗时:18969 ms;
GG2处理:耗时:28844 ms;耗时:30594 ms;耗时:30781 ms;
GG3处理:耗时:797 ms;耗时:718 ms;耗时:797 ms;
GG4处理:耗时:610 ms;耗时:687 ms;耗时:625 ms;
GG5处理:耗时:320031 ms;耗时:500391 ms;耗时:681281 ms;
|