找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1392|回复: 6

[研讨] 关于 Nth 效率的一个探讨

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2016-6-8 23:04:55 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 st788796 于 2016-6-8 23:15 编辑

C++ 中对数组都是 用 [] 直接取地址,Autolisp 中表数量多的时候用 Nth 虽然可以取,但效率一直被诟病,是不是可以改进下呢?

一般我们表中搜索会用到 assoc ,这个函数好像没有人说过效率慢,那么构造表的时候加上个序号,取第 n 个元素的时候用 assoc 是不是会快些?!

欢迎探讨!


  1. (defun c:t1 (/ i l)
  2.   (setq i -1)
  3.   (repeat 100000
  4.     (setq l (cons (setq i (1+ i)) l))
  5.   )
  6.   (nth 9000 (reverse l))
  7. )
  8. (defun c:t2 (/ i l)
  9.   (setq i -1)
  10.   (repeat 100000
  11.     (setq l (cons (cons (setq i (1+ i)) i) l))
  12.   )
  13.   (assoc 9000 l)
  14. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-6-9 02:20:11 | 显示全部楼层
不管用哪个函数,归根结底是受LISP表的存储结构影响的,存储结构不变,哪个函数都差不多。LISP表是单向resbuf表,只有从头到尾巴的指针链接起来,没尾巴到头的(双向链表),所以取哪个元素都要从头遍历,不会快。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 12个

财富等级: 恭喜发财

发表于 2016-6-9 09:09:44 | 显示全部楼层
nth 效率的确低一些,好久没用LISP了

点评

看下测试结果: *********** 第1次 *********** 9000 nth执行时间:0.05 (9000 . 9000) assoc执行时间:0.054 *********** 第2次 *********** 9000 nth执行时间:0.042 (9000 . 9000) assoc执行时间:0.  详情 回复 发表于 2016-6-9 12:40
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-6-9 12:40:50 | 显示全部楼层
小龙龙 发表于 2016-6-9 09:09
nth 效率的确低一些,好久没用LISP了

  1. (defun c:t1 (/ i l)
  2.   (setq j 0)
  3.   (repeat 10
  4.     (xdrx_prompt "\n*********** 第" (setq j (1+ j))
  5.                  "次 ***********"
  6.     )
  7.     (setq i -1)
  8.     (setq l nil)
  9.     (xdrx_runtime t)
  10.     (repeat 100000
  11.       (setq l (cons (setq i (1+ i))
  12.                     l
  13.               )
  14.       )
  15.     )
  16.     (princ "\n")
  17.     (princ (nth 9000 (reverse l)))
  18.     (xdrx_prompt "\nnth执行时间:" (xdrx_runtime))
  19.     (setq i -1 l nil)
  20.     (xdrx_runtime t)
  21.     (repeat 100000
  22.       (setq l (cons (cons (setq i (1+ i))
  23.                           i
  24.                     ) l
  25.               )
  26.       )
  27.     )
  28.     (princ "\n")
  29.     (princ (assoc 9000 l))
  30.     (xdrx_prompt "\nassoc执行时间:" (xdrx_runtime))
  31.   )
  32. )



看下测试结果:

*********** 第1次 ***********
9000
nth执行时间:0.05
(9000 . 9000)
assoc执行时间:0.054
*********** 第2次 ***********
9000
nth执行时间:0.042
(9000 . 9000)
assoc执行时间:0.051
*********** 第3次 ***********
9000
nth执行时间:0.1
(9000 . 9000)
assoc执行时间:0.06
*********** 第4次 ***********
9000
nth执行时间:0.045
(9000 . 9000)
assoc执行时间:0.064
*********** 第5次 ***********
9000
nth执行时间:0.046
(9000 . 9000)
assoc执行时间:0.059
*********** 第6次 ***********
9000
nth执行时间:0.055
(9000 . 9000)
assoc执行时间:0.056
*********** 第7次 ***********
9000
nth执行时间:0.049
(9000 . 9000)
assoc执行时间:0.061
*********** 第8次 ***********
9000
nth执行时间:0.05
(9000 . 9000)
assoc执行时间:0.06
*********** 第9次 ***********
9000
nth执行时间:0.05
(9000 . 9000)
assoc执行时间:0.052
*********** 第10次 ***********
9000
nth执行时间:0.047
(9000 . 9000)
assoc执行时间:0.06T


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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-6-9 12:45:17 | 显示全部楼层
分析看,两个函数效率是同一级别的,ASSOC除了要查询,还要判断是否相等,多用了点时间。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2016-6-9 20:33:31 来自手机 | 显示全部楼层
讨论这个的确无意义,alisp传过去的都是 resbuf * ,单链表
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 315个

财富等级: 日进斗金

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 10:32 , Processed in 0.177282 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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