明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3697|回复: 13

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

[复制链接]
发表于 2015-6-5 00:56 | 显示全部楼层 |阅读模式
本帖最后由 鱼与熊掌 于 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 赞一个!有益的探索

查看全部评分

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

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

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

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

这个代码的时间运算量  不是线性的  优化一下吧.  
可以自己写代优化
发表于 2015-6-11 01:02 | 显示全部楼层
对熊掌的说法略有不同。
  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 | 显示全部楼层
本帖最后由 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 | 显示全部楼层
循环内的代码其实也比较重要,我以前测试的感觉mapcar在数量很大的情况下比较快,跟楼上的不一样,搞不清到底谁快了,一般情况下还是差不多吧,还要考虑代码的易读和易写
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 00:53 , Processed in 0.210088 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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