明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4811|回复: 15

[经验] 大数据时代.代码不快就崩溃.关于Lisp执行效率探究

[复制链接]
发表于 2015-6-5 00:56:26 | 显示全部楼层 |阅读模式
本帖最后由 鱼与熊掌 于 2015-6-5 08:34 编辑

Lisp是在Arx托管的代码.那么Lisp的执行效率其实还是蛮低的.
今天一个代码的运行时间本来要1800秒.后来优化了半天优化到了55秒.
其中的差距可想而知,所以探究Lisp的执行效率问题很有必要.
下面是我做的探究.
Vl-remove或者Vl-remove-if-not执行效率高于Repeat
并且Mapcar>Repeat
其他的While更不用说.
总体来说
Vl-remove-if和Vl-remove-if-not的效率高于Mapcar >Repeat .至于While 或者Foreach 没做探究.While肯定比Repeat慢.

下面附上代码



本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +2 收起 理由
机械工程师 + 1 赞研究精神。
自贡黄明儒 + 1 赞一个!有益的探索

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2025-3-22 00:19:10 | 显示全部楼层
再来一个效率研究心得
  1. (setq str
  2.        "甲1子2、3乙4丑5 6—7—8 9海0中-金=
  3. 丙Q寅W、E丁R卯T Y—U—I O炉P中[火]
  4. \戊A辰S、D己F巳G H—J—K L大Z林X木C
  5. V庚B午N、M辛,未. /—— 路旁土1
  6. 2壬3申4、5癸6酉7 8—9—0 -剑=锋A金S
  7. D甲F戌G、H乙J亥K L—Z—X C山V头B火N
  8. M丙,子.、/丁1丑2 3—4—5 6涧7下8水9
  9. 0戊-寅=、A己S卯D F—G—H J城K头L土Z
  10. X庚C辰V、B辛N巳M ,—./—1 2白3蜡4金5
  11. 6壬7午8、9癸0未- =Q—W—E R杨T柳Y木U
  12. I甲O申P、[乙]\酉A S—D—F G泉H中J水K
  13. L丙Z戌X、C丁V亥B N—M—, .屋上1土2
  14. 3戊4子5、6己7丑8 9—0—- =霹Q雳W火E
  15. R庚T寅Y、U辛I卯O P—[—] \松A柏S木D
  16. F壬G辰H、J癸K巳L Z—X—C V长B流N水M
  17. ,甲.午/、乙1未2 3—4—5 6沙7中8金9
  18. 0丙-申=、丁Q酉W E—R—T Y山U下I火O
  19. P戊[戌]、\A己S亥D F—G—H J平K地L木
  20. 庚Z子X、C辛V丑B N—M—, .壁/上1土2
  21. 3壬4寅5、6癸7卯8 9—0—- =金Q箔W金E
  22. R甲T辰Y、U乙I巳O P—[—]\ 覆A灯S火D
  23. F丙G午H、J丁K未L —— ZX天C河V水B
  24. N戊M申,、.己/酉1 23—4—5 67大8驿9土0
  25. -庚=戌Q、W辛E亥R T—Y—U I钗O钏P金A
  26. S壬D子F、G癸H丑J K—L—Z X桑C柘V木B
  27. N甲M寅,、.乙/卯1 2—3—4 5大6溪7水8
  28. 9丙0辰-=、Q丁W巳E R—T—Y U沙I中O土P
  29. [戊]午]\、A己S未D F—G—H J天K上L火;
  30. '庚ZX申C、V辛B酉N M—,—. /石12榴3木4
  31. 5壬6戌7、8癸9亥0 -—=—Q W大E海R水T"
  32. )

  33. (repeat 5 (setq str (strcat str str)))
  34. (strlen str)
  35. (setq TIME0 (getvar "millisecs"))
  36. (repeat  500000
  37.   (vl-string-position (ascii "/") str)
  38. )
  39. (print
  40.   (strcat "vl-string-position耗时:"
  41.     (vl-princ-to-string
  42.       (setq hs (/ (- (getvar "millisecs") TIME0 0.0) 1000.0))
  43.     )
  44.   )
  45. )
  46. (setq TIME0 (getvar "millisecs"))
  47. (repeat  500000
  48.   (wcmatch str "[,*`/*,]")
  49. )
  50. (print
  51.   (strcat "wcmatch耗时:"
  52.     (vl-princ-to-string
  53.       (setq hs (/ (- (getvar "millisecs") TIME0 0.0) 1000.0))
  54.     )
  55.   )
  56. )




回复 支持 反对

使用道具 举报

发表于 2025-3-22 00:17:25 | 显示全部楼层
我也来一个效率研究心得

  1. (setq TIME0 (getvar "millisecs"))
  2. (SETQ i 0)
  3. (REPEAT  50000000
  4.   (if (not jb)(progn (setq jb (itoa i)) (setq i (1+ i))))
  5. )
  6. (setq hs (/ (- (getvar "millisecs") TIME0 0.0) 1000.0))
  7. (print(strcat "有not耗时:"(vl-princ-to-string hs)))
  8. ;有一个not,执行效率低

  9. (setq TIME0 (getvar "millisecs"))
  10. (SETQ i 0)
  11. (REPEAT  50000000  
  12.   (if jb ()(progn (setq jb (itoa i)) (setq i (1+ i))))
  13. )
  14. (setq hs (/ (- (getvar "millisecs") TIME0 0.0) 1000.0))
  15. (print(strcat "无not耗时:"(vl-princ-to-string hs)))
  16. ;没有not,执行效率高,而且编译vlx后,估计不同,有待测试

回复 支持 反对

使用道具 举报

发表于 2021-9-29 17:42:22 | 显示全部楼层
感谢分享宝贵经验!
 楼主| 发表于 2015-6-5 08:34:44 | 显示全部楼层
不好意思.之前上的代码可能有点错误.修正了一下.
总体来说  尽量使用Mapcar 或者vl-remove-if-not这样的自带分层函数来优化代码
可以加速非常多.
发表于 2015-6-5 13:59:04 | 显示全部楼层
多谢大侠分享!咱们享受了[em0]
 楼主| 发表于 2015-6-5 14:23:12 | 显示全部楼层
434939575 发表于 2015-6-5 13:59
多谢大侠分享!咱们享受了

发现Foreach和Mapcar一样  没什么区别 之前有人说Foreach 执行效率问题..其实应该没有
发表于 2015-6-10 22:14:29 | 显示全部楼层
mapcar有个好出,如果批量生成图形,那么需要一个CTRL+Z即可返回,但不确定包含command函数是否可以。
发表于 2015-6-10 23:06:58 来自手机 | 显示全部楼层
某些情况下cad环境
对程序的运行也会有重大影响
比如附赠工具中的burst(炸块同时属性转文字)
假设选100个块运行需要0.5秒
选200个块运行需要2秒
选500个块运行需要20秒
选5000个块运行需要30分钟

曾经使出浑身解数也只是改善而不能解决
最终彻底解决所采用的办法是
计数至1000时保存关闭再打开再运行

或许这个例子和楼主所讨论的
属于不同的技术层面
但最终目的是基本一致的
所以适当的情况转换下思路
或许会有意外的收获
 楼主| 发表于 2015-6-10 23:27:51 | 显示全部楼层
masterlong 发表于 2015-6-10 23:06
某些情况下cad环境
对程序的运行也会有重大影响
比如附赠工具中的burst(炸块同时属性转文字)

这个代码的时间运算量  不是线性的  优化一下吧.  
可以自己写代优化
发表于 2015-6-11 01:02:50 | 显示全部楼层
对熊掌的说法略有不同。
  1. ;计时器开始******************
  2. (defun cx-jsq () ;计时器开始
  3.   (setq time_tmp (getvar "TDUSRTIMER"))
  4. )
  5. ;计时器结束*****************
  6. (defun cx-end-jsq () ;计时器结束
  7.   (setq  time_tmp (- (getvar "TDUSRTIMER") time_tmp)
  8.     ;获得时间,单位小时
  9.     time_tmp (* time_tmp 86400)
  10.   ) ;秒为单位
  11.   (prompt (strcat "用时" (rtos time_tmp 2 4) "秒"))
  12.   (setq time_tmp nil)
  13.   (princ)
  14. )
  15. ;;;准备测试的数据表
  16. (defun c:xx()
  17.   (setq all_lst nil)
  18.   (setq lst '((0 0 0)(1 1 0)))
  19.   (repeat 10000
  20.     (setq all_lst(cons lst all_lst))
  21.   )
  22. (princ)
  23. )
  24. ;;;repeat
  25. (defun c:xx1()  
  26.   (setq all_lst1 all_lst)
  27.   (setq n (length all_lst1))
  28.   (cx-jsq)
  29.   (repeat n
  30.     (setq x (car all_lst1))
  31.     (entmake (list '(0 . "line") (cons 10 (car x)) (cons 11 (cadr x))))
  32.     (setq ll_lst1 (cdr ll_lst1))
  33.   )
  34.   (cx-end-jsq)
  35. (princ)
  36. )
  37. ;;;foreach
  38. (defun c:xx2()  
  39.   (setq all_lst1 all_lst)
  40.   (cx-jsq)
  41.   (foreach x all_lst1
  42.     (entmake (list '(0 . "line") (cons 10 (car x)) (cons 11 (cadr x))))
  43.   )
  44.   (cx-end-jsq)
  45. (princ)
  46. )
  47. ;;;mapcar
  48. (defun c:xx3()  
  49.   (setq all_lst1 all_lst)
  50.   (cx-jsq)
  51.   (mapcar '(lambda (x)
  52.     (entmake (list '(0 . "line") (cons 10 (car x)) (cons 11 (cadr x)))))
  53.     all_lst1
  54.   )
  55.   (cx-end-jsq)
  56. (princ)
  57. )
测试结果很明显和熊掌的不一样~~~~
命令: xx
命令:
命令: xx1
用时0.202秒
命令:
命令: xx2
用时0.221秒
命令:
命令: xx3
用时0.24秒
命令:
发表于 2015-6-11 01:08:15 | 显示全部楼层
本帖最后由 77077 于 2015-6-11 01:18 编辑

再增加到10w个测试了一遍,并增加while的比较:
  1. ;;;while
  2. (defun c:xx4()  
  3.   (setq all_lst1 all_lst)
  4.   (setq n (length all_lst1))
  5.   (cx-jsq)
  6.   (while (setq x (car all_lst1))
  7.     (entmake (list '(0 . "line") (cons 10 (car x)) (cons 11 (cadr x))))
  8.     (setq all_lst1 (cdr all_lst1))
  9.   )
  10.   (cx-end-jsq)
  11. (princ)
  12. )
命令: xx
命令:
命令: xx1 用时1.904秒
命令:
命令: xx2 用时1.868秒
命令:
命令: xx3 用时1.963秒
命令:
命令: xx4 用时1.849秒
命令:
发表于 2015-6-11 11:21:57 | 显示全部楼层
循环内的代码其实也比较重要,我以前测试的感觉mapcar在数量很大的情况下比较快,跟楼上的不一样,搞不清到底谁快了,一般情况下还是差不多吧,还要考虑代码的易读和易写
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-4-1 09:35 , Processed in 0.177097 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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