找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3675|回复: 18

[教学]:append和cons的在执行速度上的差别

[复制链接]

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2006-4-17 09:31:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
今天试了一下陈老的数组生成程序,发现用cons和用append生成数组表在速度上有着巨大的差别。建议大家在程序中生成大数组时采用cons函数。
程序代码如下:

  1.   [FONT=courier new]
  2. (Defun C:TArray (/ l n nn ts te tt)
  3.        (SetQ l '()
  4.              n 0.0
  5.              nn (GetReal "\n数组个数: ")
  6.              ts (GetVar "cdate")
  7.        )
  8.        (While (<= n nn)
  9.                      (SetQ l (Cons (List n '(1.23456 200.0 1234567.89)) l)
  10.                            n (1+ n)
  11.                      )
  12.        )
  13.        (SetQ l (Reverse l)
  14.              te (GetVar "cdate")
  15.              tt (* 1000000 (- te ts))
  16.        )
  17.        (Alert (StrCat "生成完了。\n共耗时" (RToS tt 2 4) "秒\n现在可以查找数据了..."))
  18.        (While (Progn (InitGet 5 " ")
  19.                      (SetQ n (GetReal (StrCat "\n序号 0-" (RToS nn 2 0) ": ")))
  20.                      (/= "" n)
  21.               )
  22.               (PrinC "\n数组元素: ") (PrinC (Nth (Fix n) l))
  23.        )

  24.   (princ)
  25. )


  26. (Defun C:TA (/ l n nn ts te tt)
  27.        (SetQ l '()
  28.              n 0.0
  29.              nn (GetReal "\n数组个数: ")
  30.              ts (GetVar "cdate")
  31.        )
  32.        (While (<= n nn)
  33.                      (SetQ l (append l (list (List n '(1.23456 200.0 1234567.89))))
  34.                            n (1+ n)
  35.                      )
  36.        )
  37.        (SetQ te (GetVar "cdate")
  38.              tt (* 1000000 (- te ts))
  39.        )
  40.        (Alert (StrCat "生成完了。\n共耗时" (RToS tt 2 4) "秒\n现在可以查找数据了..."))
  41.        (While (Progn (InitGet 5 " ")
  42.                      (SetQ n (GetReal (StrCat "\n序号 0-" (RToS nn 2 0) ": ")))
  43.                      (/= "" n)
  44.               )
  45.               (PrinC "\n数组元素: ") (PrinC (Nth (Fix n) l))
  46.        )
  47.        (princ)
  48. )
  49. [/FONT]
复制代码

函数tarray采用cons生成数组,函数ta采用append生成数组,生成的速度有着巨大的差别,下图是在2004中用两个函数分别生成10000个数组所花费的时间。用cons比append快了几百倍。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-4-17 17:30:09 | 显示全部楼层
我好久就發現了, 不過只是在很大的程序才會考慮涵數的優化選用, 一般寫小的程序就不必在意了(原因是現在的電腦硬件都很快, 通常要處理的表的長度都在100來個左右, 根本感覺不到有差別, 反而選用 CONS 還要把處理好的表用Reverse倒一下順序), 呵呵!
    樓主時間看來比較充分, 有空多多研究涵數的運行速度是好事!!!!  也希望大家有這樣的心去寫程序, 這樣對技巧的提高有好大的幫助.
     有個建議: 我覺的lisp 涵數中的 vla-intersectwith 最慢(大家都知道) 要是大家通過討論提高找對象交點的方法, 很好哦, 因為這個涵數如果在一個程序用的次數多的話無論是好的硬件都受不了啊!  樓主多多研究這個好!!!!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

 楼主| 发表于 2006-4-17 18:51:09 | 显示全部楼层
vla-intersectwith 最慢吗?这个我到没有感觉到,我现在编的一个程序就是通过vla-intersectwith获得交点,在存储到表中,测试了一下一共7360个交点,构造一个表,采用append需要大约17~20秒,用cons需要不到7秒,这么看来主要还是append费了时间。不过说明一下,我采集的交点都是简单实体pline和line的交点,而且保证两个实体只有一个交点。楼上所说的慢是不是因为两个实体本身较复杂,而且有多个交点,这种情况我还没有测试过。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-17 22:12:55 | 显示全部楼层
append和cons的在执行速度上的差别 早几年就讨论过了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2006-4-18 15:44:48 | 显示全部楼层
既然差别这么大,为什么LISP里面要有append和cons两个函数呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-18 16:51:15 | 显示全部楼层
  1. [FONT=courier new](load "xyp_lib.vlx")  ;版本 V.200600404
  2. ;|下载和加载通用函数(可在签名栏直接下载后放到搜索路径下)
  3. 利用以下任何一种方式(首选第一种)即可加载和运行通用函数内的所有子程序:
  4. ★1·在acad.lsp中增加(load"xyp_lib.vlx")
  5. ■2·在每个程序内增加(load"xyp_lib.vlx")
  6. ■3·在command下,输入(load"xyp_lib.vlx")
  7. ■4·在菜单.mnl中增加(load"xyp_lib.vlx")
  8. ■5·将xyp_lib.vlx文件直接拽到cad屏幕
  9. [COLOR=red] ★通用函数下载地址:[/COLOR]
  10. [url]http://www.xdcad.net/forum/attachment.php?s=&postid=1606661[/url]
  11. |;

  12. (Defun C:TArray        (/ i l0 l n)
  13.   (cmdla0)
  14.   (SetQ        j  (UINT 1 "" "\n数组个数: " j)
  15.         l0 '(1.23456 200.0 1234567.89)
  16.         i  -1
  17.         n  0
  18.   )
  19.   (xyp-get-StartTime)
  20.   (repeat j
  21.     (SetQ l (cons (List (setq i (1+ i)) l0) l))
  22.   )
  23.   (setq l (reverse l))
  24.   (xyp-get-UsedTime)
  25.   (While (SetQ n (Getint (StrCat "\n输入要查找数据的序号 0-"
  26.                                  (rtos j 2 0)
  27.                                  " <回车退出>: "
  28.                          )
  29.                  )
  30.          )
  31.     (PrinC "\n数组元素: ")
  32.     (PrinC (Nth n l))
  33.   )
  34.   (cmdla1)
  35. )
  36. [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-18 22:53:16 | 显示全部楼层
请问xyp1964 ,你用repeat 效率如何?比对过么?把比对结果也拿出来嘛
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-18 22:58:59 | 显示全部楼层
最初由 雨箭风刀 发布
[B]请问xyp1964 ,你用repeat 效率如何?比对过么?把比对结果也拿出来嘛 [/B]


测试结果(与电脑本身的配置有关):
Command: TArray
数组个数: : 10000
用时 : 0.03秒
输入要查找数据的序号 0-10000 <回车退出>: 5
数组元素: (5 (1.23456 200.0 1.23457e+006))
输入要查找数据的序号 0-10000 <回车退出>:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-19 11:32:39 | 显示全部楼层
也不一定要用reverse ,可以将循环起终点交换,另外vl-list*速度和cons速度很接近,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-1-24 00:35:01 | 显示全部楼层
现在我都还没有考虑到速度和优化的问题,看了楼上的测试,才知道有这些差别。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-1-24 14:13:20 | 显示全部楼层
回復 zhang8755 版主, 我主要是用vla-intersectwith  去找 SPLINE 和SPLINE之間的交點, 可能是SPLINE本身的因素, 會慢一點吧,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

 楼主| 发表于 2007-1-24 15:40:55 | 显示全部楼层
我的测试中,采用 cons 构造时 用了7秒,看来主要是vla-intersectwith命令花费的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2007-1-26 23:00:59 | 显示全部楼层
最初由 zhang8755 发布
[B]我的测试中,采用 cons 构造时 用了7秒,看来主要是vla-intersectwith命令花费的 [/B]


No
cons肯定少花时间
不信自己写一个排序函数,再多一点数据排序比较就知道了.

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-29 08:53 , Processed in 0.676174 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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