明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: 鱼与熊掌

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

[复制链接]
发表于 2015-6-11 11:44:49 | 显示全部楼层
  1. ;计时器开始******************
  2. (defun cx-jsq ()
  3.   (setq time_tmp (getvar "TDUSRTIMER"))
  4. )
  5. (defun cx-end-jsq ()
  6.   (setq        time_tmp (- (getvar "TDUSRTIMER") time_tmp)
  7.                 time_tmp (* time_tmp 86400)
  8.   )
  9.   (prompt (strcat "用时" (rtos time_tmp 2 4) "秒"))
  10.   (setq time_tmp nil)
  11.   (princ)
  12. )
  13. ;准备测试数据
  14. (defun c:tx1()
  15.         (cx-jsq)
  16.         (setq all_lst1 nil)
  17.         (setq lst '((1 "a") (2 "b") (3 "c")))
  18.         (repeat 100000 ;10w个原子
  19.           (setq all_lst1(cons lst all_lst1))
  20.         )
  21.         (cx-end-jsq)
  22.   (princ)
  23. )
  24. ;开始测试,都让他们删除掉“0”开头的数据
  25. ;mapcar
  26. (defun c:tt1()
  27.         (cx-jsq)
  28.         (setq all_lst all_lst1)
  29.         (setq lstx1 nil)
  30.         (mapcar '(lambda(x) (if(= 1 (car x)) (setq lstx1 (cons x lstx1))))all_lst)
  31.   (cx-end-jsq)
  32.   (princ)
  33. )
  34. ;l-remove-if-not
  35. (defun c:tt2()
  36.         (cx-jsq)
  37.         (setq all_lst all_lst1)
  38.         (setq lstx2 nil)
  39.         (setq lstx2(vl-remove-if-not '(lambda(x) (= 1 (car x))) all_lst))
  40.   (cx-end-jsq)
  41.   (princ)
  42. )
  43. ;repeat
  44. (defun c:tt3()
  45.         (cx-jsq)
  46.         (setq all_lst all_lst1)
  47.         (setq lstx3 nil)
  48.         (setq n (length all_lst))
  49.         (repeat n
  50.                 (setq x (car all_lst))
  51.                 (if(= 1(car x)) (setq lstx3 (cons x lstx3)))
  52.                 (setq all_lst (cdr all_lst))
  53.         )
  54.   (cx-end-jsq)
  55.   (princ)
  56. )
  57. ;while
  58. (defun c:tt4()
  59.         (cx-jsq)
  60.         (setq all_lst all_lst1)
  61.         (setq lstx4 nil)
  62.         (setq n (length all_lst))
  63.         (while (setq x (car all_lst))
  64.                 (if(= 1(car x)) (setq lstx4 (cons x lstx4)))
  65.                 (setq all_lst (cdr all_lst))
  66.         )
  67.   (cx-end-jsq)
  68.   (princ)
  69. )
  70. ;foreach
  71. (defun c:tt5()
  72.         (cx-jsq)
  73.         (setq all_lst all_lst1)
  74.         (setq lstx4 nil)
  75.         (setq n (length all_lst))
  76.         (foreach x all_lst
  77.                 (if(= 1(car x)) (setq lstx5 (cons x lstx5)))
  78.         )
  79.   (cx-end-jsq)
  80.   (princ)
  81. )
第一遍测试
命令: tx1 用时0.064秒
命令:
命令: tt1 用时0.078秒
命令:
命令: tt2 用时0.065秒
命令:
命令: tt3 用时0.088秒
命令:
命令: tt4 用时0.096秒
命令:
命令: tt5 用时0.098秒



第二遍测试
命令: tx1 用时0.052秒
命令:
命令: tt1 用时0.058秒
命令:
命令: tt2 用时0.065秒
命令:
命令: tt3 用时0.092秒
命令:
命令: tt4 用时0.046秒
命令:
命令: tt5 用时0.069秒
发表于 2015-6-11 13:01:27 来自手机 | 显示全部楼层
autolisp如果仅是表操作,也就是ARX的输入和输出,涉及到Autocad Object 就有很大区别了,不管是 repeat while mapcar 还是foreach都有自己的用途
发表于 2015-6-19 22:11:36 | 显示全部楼层
学习了     
发表于 2021-9-29 17:42:22 | 显示全部楼层
感谢分享宝贵经验!
发表于 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后,估计不同,有待测试

回复 支持 反对

使用道具 举报

发表于 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. )




回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-1 09:47 , Processed in 0.167708 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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