找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: Lispboy

[研讨] 关于LISP表处理的测试练习,看看谁的代码高效的前提下更简洁

[复制链接]

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-5-26 22:30:47 | 显示全部楼层
Lispboy 发表于 2013-5-26 22:27
是的,T8 最快。 NEWER的APPEND的,现在还没出来呢。在等。

append表越长越慢!由Lisp公理决定了的!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-5-26 22:31:57 | 显示全部楼层
所以,大家在写消除重线啥的,如果 组点对 那样的操作,用underway的代码,数量级差几个级别呢。

最好是不要出现APPEND。 append 的10多分钟了,还没结果呢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-5-26 22:35:09 | 显示全部楼层
Free-Lancer 发表于 2013-5-26 22:29
测试时打开vlide和关闭也是有很大区别的

测绝对时间没意义的,在相同环境下即可了。看的是相对的速度。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-5-26 22:39:57 | 显示全部楼层
本帖最后由 Lispboy 于 2013-5-27 00:21 编辑

得到一个结论是:

1、尽量用mapcar ,apply 组合 cons,car,cdr 基本函数  ,ACAD内部肯定有没公布的秘密对表的操作。要不不能0.01秒就处理完。
2、如果只能用APPEND的,那么程序就不要写了。
3、 循环里面也别要 nth 去读表,也很慢的,要一次次的遍历表,循环越多,速度越慢,N*N至少
4、不怕 reverse  ,  也很快。5 、巨量数据的处理,请别用递归。

最优代码应该是T12,根源在于用了AUTOLISP的基本函数,和无条件判断。

[pcode=lisp,true]
(defun c:t12 ()
  (setq t1 (get-utime))
  (setq abc (mapcar
              'list
              ll
              (cdr ll)
            )
  )
  (setq t2 (get-utime))
  (princ "\nUse Time: ")
  (princ (- t2 t1))
  (princ " s")
  (princ)
)
[/pcode]

  1. 命令:
  2. 命令: t8
  3. Use Time: 0.024 s
  4. 命令:
  5. 命令: t8
  6. Use Time: 0.031 s
  7. 命令:
  8. 命令: t12
  9. Use Time: 0.028 s
  10. 命令:
  11. 命令: t12
  12. Use Time: 0.029 s
  13. 命令:
  14. 命令: t8
  15. Use Time: 0.028 s
  16. 命令:
  17. 命令: t12
  18. Use Time: 0.03 s
  19. 命令:



评分

参与人数 2D豆 +15 贡献 +1 收起 理由
XDSoft + 10 + 1 有始有终奖!
牢固 + 5 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-5-26 22:43:51 | 显示全部楼层
Free-Lancer 发表于 2013-5-26 22:29
测试时打开vlide和关闭也是有很大区别的

编译成VLX更快!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 10399个

财富等级: 富甲天下

发表于 2013-5-26 22:55:55 | 显示全部楼层
好象(mapcar 'list a (cdr a))最快

评分

参与人数 1D豆 +5 收起 理由
Lispboy + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-5-26 22:55:55 | 显示全部楼层
牢固 发表于 2013-5-26 22:43
编译成VLX更快!

为什么ARX效率要高,编译是一方面,另外,更主要的,因为C++数据类型丰富,尤其是指针,链表结构,可以自己定义链表结构,比如双向链表等等,利用好的数据结构,利用好的算法、让程序的效率更高。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-5-27 00:13:32 | 显示全部楼层
zxq0220 发表于 2013-5-26 22:55
好象(mapcar 'list a (cdr a))最快

  1. (defun c:t12 ()
  2.   (setq t1 (get-utime))
  3.   (mapcar
  4.     'list
  5.     ll
  6.     (cdr ll)
  7.   )
  8.   (setq t2 (get-utime))
  9.   (princ "\nUse Time: ")
  10.   (princ (- t2 t1))
  11.   (princ " s")
  12.   (princ)
  13. )


  1. 命令:
  2. 命令: t8
  3. Use Time: 0.024 s

  4. 命令:
  5. 命令: t8

  6. Use Time: 0.031 s

  7. 命令:
  8. 命令: t12

  9. Use Time: 0.028 s

  10. 命令:
  11. 命令: t12

  12. Use Time: 0.029 s

  13. 命令:
  14. 命令: t8

  15. Use Time: 0.028 s

  16. 命令:
  17. 命令: t12

  18. Use Time: 0.03 s

  19. 命令:


51# 同 T8基本一样,代码更简洁。这个应该是最优答案
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2013-5-27 09:37:30 | 显示全部楼层
本帖最后由 wowan1314 于 2013-5-27 10:21 编辑

   感觉还是应该再详细的测试下。首先比较下不同的while写法。
  1. (defun get-utime () (* 86400.0 (getvar "tdusrtimer")))
  2. (DEFUN C:100W (/ I LL)
  3.   (setq i 0)
  4.   (setq ll nil)
  5.   (repeat 1000000
  6.     (setq ll (cons (setq i (1+ i))
  7.                    ll
  8.              )
  9.     )
  10.   )
  11. (setq time1 (get-utime))
  12. (t1 ll)
  13. (setq time2 (get-utime))
  14. (princ "\nwhile方法1:")(princ (- time2 time1))(princ "s")
  15. (setq time1 (get-utime))
  16. (t2 ll)
  17. (setq time2 (get-utime))
  18. (princ "\nwhile方法2:")(princ (- time2 time1))(princ "s")
  19. (setq time1 (get-utime))
  20. (t3 ll)
  21. (setq time2 (get-utime))
  22. (princ "\nwhile方法3:")(princ (- time2 time1))(princ "s")
  23. (PRINC)
  24. )

  25. ;;WHILE方法1
  26. (DEFUN T1 (LST / LST1)
  27.   (SETQ LST1 NIL)
  28.   (WHILE (SETQ LST1 (CONS (LIST (CAR LST) (CADR LST)) LST1)
  29.                LST (CDR LST)
  30.          )
  31.   )
  32.   (reverse (CDR LST1))
  33. )
  34. ;;WHILE方法2
  35. (DEFUN T2 (LST / LST1)
  36.   (SETQ LST1 NIL)
  37.   (WHILE (CDR LST)
  38.         (SETQ LST1 (CONS (LIST (CAR LST) (CADR LST)) LST1)
  39.                LST (CDR LST)
  40.          )
  41.   )
  42.   (reverse LST1)
  43. )
  44. ;;WHILE方法3
  45. (DEFUN T3 (LST / LST1)
  46.   (SETQ LST1 NIL)
  47.   (WHILE (CADR LST)
  48.         (SETQ LST1 (CONS (LIST (CAR LST) (CADR LST)) LST1)
  49.                LST (CDR LST)
  50.          )
  51.   )
  52.   (reverse LST1)
  53. )
3种写法都能得到正确答案。那么其效率测试如下。

命令: 100W


while方法1:0.797s
while方法2:0.89s
while方法3:1.047s


命令:
命令:
100W
while方法1:0.797s
while方法2:0.891s
while方法3:1.046s


命令:
命令:
100W
while方法1:0.782s
while方法2:0.89s
while方法3:1.063s


结论:while内尽量少放代码。CAR CDR的效率比他们组合起来的效率高(好像是废话)。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-27 09:43:08 | 显示全部楼层
本帖最后由 wowan1314 于 2013-5-27 10:15 编辑

   测试while写法与foreach写法的效率:
  1. (DEFUN C:100W (/ I LL)
  2.   (setq i 0)
  3.   (setq ll nil)
  4.   (repeat 1000000
  5.     (setq ll (cons (setq i (1+ i))
  6.                    ll
  7.              )
  8.     )
  9.   )
  10. (setq time1 (get-utime))
  11. (t1 ll)
  12. (setq time2 (get-utime))
  13. (princ "\nwhile方法1:")(princ (- time2 time1))(princ "s")
  14. (setq time1 (get-utime))
  15. (t2 ll)
  16. (setq time2 (get-utime))
  17. (princ "\nforeach方法:")(princ (- time2 time1))(princ "s")
  18. (PRINC)
  19. )

  20. ;;WHILE方法1
  21. (DEFUN T1 (LST / LST1)
  22.   (SETQ LST1 NIL)
  23.   (WHILE (SETQ LST1 (CONS (LIST (CAR LST) (CADR LST)) LST1)
  24.                LST (CDR LST)
  25.          )
  26.   )
  27.   (reverse (CDR LST1))
  28. )

  29. ;;foreach方法
  30. (DEFUN T2 (A / LST)
  31. (SETQ LST NIL)
  32. (foreach b a (setq lst (cons (list b (cadr a)) lst) a (cdr a)))
  33. (reverse (CDR LST))
  34. )
同样测试三次。

命令: 100W


while方法1:0.813s
foreach方法:0.937s


命令:
命令:
100W
while方法1:0.812s
foreach方法:0.938s


命令:
命令:
100W
while方法1:0.797s
foreach方法:0.969s


结论:while方法比foreach效率要高一点点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-27 09:51:18 | 显示全部楼层
本帖最后由 wowan1314 于 2013-5-27 10:19 编辑

   再来测试mapcar写法。 一个是加APPLY。一个是直接mapcar.
  1. (defun get-utime () (* 86400.0 (getvar "tdusrtimer")))
  2. (DEFUN C:100W (/ I LL)
  3.   (setq i 0)
  4.   (setq ll nil)
  5.   (repeat 1000000
  6.     (setq ll (cons (setq i (1+ i))
  7.                    ll
  8.              )
  9.     )
  10.   )
  11. (setq time1 (get-utime))
  12. (t1 ll)
  13. (setq time2 (get-utime))
  14. (princ "\nwhile方法1:")(princ (- time2 time1))(princ "s")
  15. (setq time1 (get-utime))
  16. (t2 ll)
  17. (setq time2 (get-utime))
  18. (princ "\nmapcar方法1:")(princ (- time2 time1))(princ "s")
  19. (setq time1 (get-utime))
  20. (t3 ll)
  21. (setq time2 (get-utime))
  22. (princ "\nmapcar方法2:")(princ (- time2 time1))(princ "s")
  23. (PRINC)
  24. )

  25. ;;WHILE方法1
  26. (DEFUN T1 (LST / LST1)
  27.   (SETQ LST1 NIL)
  28.   (WHILE (SETQ LST1 (CONS (LIST (CAR LST) (CADR LST)) LST1)
  29.                LST (CDR LST)
  30.          )
  31.   )
  32.   (reverse (CDR LST1))
  33. )

  34. ;;mapcar方法1
  35. (DEFUN T2 (a)
  36. (apply 'mapcar (cons 'list (list a (cdr a))))
  37. )
  38. ;;mapcar方法2
  39. (DEFUN T3 (a)
  40. (mapcar 'LIST a (cdr a))
  41. )
下面是三次测试结果:见证奇迹的时候到了

命令: 100W

while方法1:0.797s
mapcar方法1:0.156s
mapcar方法2:0.156s


命令:
命令:
100W
while方法1:0.812s
mapcar方法1:0.141s
mapcar方法2:0.156s


命令:
命令:
100W
while方法1:0.797s
mapcar方法1:0.156s
mapcar方法2:0.156s


结论:mapcar函数无疑是高效的。差别是很明显的。
           意外的发现是加了APPLY函数竟然不比纯mapcar函数慢,甚至隐隐要快上一丝。。 APPLY函数最高效。它对函数没任何影响。

评分

参与人数 3D豆 +25 贡献 +1 收起 理由
XDSoft + 10 + 1 有始有终奖!
Lispboy + 5 有始有终奖!
eachy + 10 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-27 10:26:54 | 显示全部楼层
1、while foreach repeat三个循环遍历函数while最高效foreach次之。但差别不大。可忽略。
2、mapcar比任何循环都要高效很多。
3、APPLY对函数影响甚微。加上他代码看着费事了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-27 10:29:46 | 显示全部楼层
wowan1314 发表于 2013-5-27 07:51
再来测试mapcar写法。 一个是加APPLY。一个是直接mapcar.下面是三次测试结果:见证奇迹的时候到了

命 ...

同样的内容结果不一样,电脑在后台走私活?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-27 10:40:27 | 显示全部楼层
呵呵。搞不懂了。 你可以自己再测测。 我也觉的不加APPLY应该会快点呀。

其实最意外的是APPLY对MAPCAR函数基本没影响。速度基本没区别。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 19:33 , Processed in 0.260322 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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