找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: pengfei2010

[研讨] mapcar等循环函数优化测试 二期代码

[复制链接]

已领礼包: 3255个

财富等级: 富可敌国

 楼主| 发表于 2013-6-4 18:23:31 | 显示全部楼层
Lispboy 发表于 2013-6-4 18:08
接下来看 foreach 的, foreach为啥慢,因为你里面entget的地方用了append, 这个地方没必要用append, 把两 ...

foreach 对表里面的每一个原子都要判断啊 ,而前面的while和repeat用(assoc 10 xxx)这样的话中间很多其他原子就跳过去了,省去很多判断时间了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-4 18:25:38 | 显示全部楼层
pengfei2010 发表于 2013-6-4 18:17
(repeat num
                   (setq  lst  (cons (cdr (assoc 10 zm)) lst)  zm  (cdr ...

不是让你放到循环外面啊,是让你在循环里面只计算一次,其他用的地方用变量引用

  1. (repeat (sslength ss)
  2.              (setq zm (entget (ssname ss i)) j 0)
  3.              (repeat num
  4.                    (setq n10 (assoc 10 zm))
  5.                    (setq lst (cons (cdr n10) lst) zm (cdr (member n10 zm)));不能用member函数,算法很好,不公平
  6.                  ;------
  7.              )


点评

对对对,原来是这个意思哇。。。我都没有考虑到这些细节呢  详情 回复 发表于 2013-6-4 19:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2013-6-4 18:37:38 | 显示全部楼层
首先:楼主的这个追求代码效率的精神很难得!
其实不是每个程序,都用mapcar才是最好的

最重要的一点就是循环的越多,就越慢,不管用什么

点评

开心大侠,我的初衷是想知道,影响循环函数速度的因素有哪些,我没有说mapcar最好的  详情 回复 发表于 2013-6-4 19:33
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2013-6-4 18:40:43 | 显示全部楼层
另外 append 是个执行起来超慢的函数,
就是它是一个拉后腿的函数,不用它试试速度快了多少

点评

为什么都说append函数很慢呀,感觉如果只用一次还是很快的 比如(append lst1 lst2 lst3。。。stn 。。。)这样一次搞定那么多,不是很爽吗 配合apply 不就ok滴啦  详情 回复 发表于 2013-6-4 19:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-4 18:40:45 | 显示全部楼层
本帖最后由 Lispboy 于 2013-6-4 18:46 编辑
pengfei2010 发表于 2013-6-4 18:23
foreach 对表里面的每一个原子都要判断啊 ,而前面的while和repeat用(assoc 10 xxx)这样的话中间很多其 ...

意思是你没必要,用一个FOREACH 去把entget得到的表,都组织一个大表,然后在用一个foreach去处理每个entget的表

你对测试理解错了,不是用foreach了,在里面代码就不能用assoc了
你直接
  1. (foreach n ents
  2.       (setq ed (entget n))
  3.       (setq pts (vl-remove-if-not '(lambda(x)(= (car x) 10)) ed)
  4.       (setq pts1 (cons pts pts1))
  5. )


几个函数凡是取顶点的时候你都用同一个 vl-remove-if-not

你测试的是最外层那个循环结构的效率。最外层是用MAPCAR,REPEAT,WHILE,里面代码都争取一样。
我现在才理解了你说的不公平的意思,你让他们公平不就得了,除了最外面的循环不同外,里面都一样。也没必要最后的点表是所有实体顶点的表,两层表也可以((n1...nn)(m1...mn).......),这样的表结构才符合需要,每个元素对应的是一个多段线的顶点表。 哪怕以后你希望都变成一个大顶点表,处理下即可,如果你直接到最终的大表了,需要每个多段线的顶点表的时候你怎么办? 回不去了。

你测试的是结构的效率。
         

点评

明白了,谢谢你的指点啊,感觉我离高手越来越近啦 呵呵  详情 回复 发表于 2013-6-4 19:28

评分

参与人数 2D豆 +15 贡献 +1 收起 理由
XDSoft + 10 + 1 有始有终奖!
炫翔 + 5 有始有终奖!

查看全部评分

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

使用道具 举报

已领礼包: 3255个

财富等级: 富可敌国

 楼主| 发表于 2013-6-4 19:28:59 | 显示全部楼层
Lispboy 发表于 2013-6-4 18:40
意思是你没必要,用一个FOREACH 去把entget得到的表,都组织一个大表,然后在用一个foreach去处理每个ent ...

明白了,谢谢你的指点啊,感觉我离高手越来越近啦 呵呵

点评

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-4 19:31:33 | 显示全部楼层
pengfei2010 发表于 2013-6-4 19:28
明白了,谢谢你的指点啊,感觉我离高手越来越近啦 呵呵

那等着看你第三期的代码啊。

点评

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

使用道具 举报

已领礼包: 3255个

财富等级: 富可敌国

 楼主| 发表于 2013-6-4 19:31:47 | 显示全部楼层
Lispboy 发表于 2013-6-4 18:25
不是让你放到循环外面啊,是让你在循环里面只计算一次,其他用的地方用变量引用

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

使用道具 举报

已领礼包: 3255个

财富等级: 富可敌国

 楼主| 发表于 2013-6-4 19:33:05 | 显示全部楼层
炫翔 发表于 2013-6-4 18:37
首先:楼主的这个追求代码效率的精神很难得!
其实不是每个程序,都用mapcar才是最好的

开心大侠,我的初衷是想知道,影响循环函数速度的因素有哪些,我没有说mapcar最好的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3255个

财富等级: 富可敌国

 楼主| 发表于 2013-6-4 19:35:19 | 显示全部楼层
炫翔 发表于 2013-6-4 18:40
另外 append 是个执行起来超慢的函数,
就是它是一个拉后腿的函数,不用它试试速度快了多少

为什么都说append函数很慢呀,感觉如果只用一次还是很快的  比如(append lst1 lst2 lst3。。。stn 。。。)这样一次搞定那么多,不是很爽吗:lol   配合apply  不就ok滴啦

点评

看表的长度决定是否采用 append,比如 elist 最后附加一个组码,append 既简单也好理解, (append elist '((60 . 1)))[/pcode] 非要追求效率(这个效率也未经测试) (reverse (cons '(60 . 1) (reverse elist  详情 回复 发表于 2013-6-5 08:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3255个

财富等级: 富可敌国

 楼主| 发表于 2013-6-4 19:36:59 | 显示全部楼层
Lispboy 发表于 2013-6-4 19:31
那等着看你第三期的代码啊。

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

使用道具 举报

已领礼包: 9833个

财富等级: 富甲天下

发表于 2013-6-5 08:03:50 | 显示全部楼层
提高程序运行速度的方法
1、变量名称不超过六位字符;
2、能用+1函数的不用(+ x 1),同理-1函数;
3、能在循环外运算的移到循环外;
4、能用整数的不用实数;
5、能用cons的不用append;
6、能一次计算出来不计算两次;
7、能通过函数功能过滤得到选择集的不用循环筛选;
8、能使用默认值的用默认值;
9、能通过系统变量改变绘图系统的不用命令改变;
10、能用+的不用*,能用*的不用/;

点评

哇,你这些规则是怎么来的呀?官方提供的嘛?感觉太给力了!!!据说alisp有7个亲儿子,car、cdr、lambda、mapcar 另外还有哪几个呀?您知道吗?  详情 回复 发表于 2013-6-5 08:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3255个

财富等级: 富可敌国

 楼主| 发表于 2013-6-5 08:27:01 | 显示全部楼层
zxq0220 发表于 2013-6-5 08:03
提高程序运行速度的方法
1、变量名称不超过六位字符;
2、能用+1函数的不用(+ x 1),同理-1函数;

哇,你这些规则是怎么来的呀?官方提供的嘛?感觉太给力了!!!据说alisp有7个亲儿子,car、cdr、lambda、mapcar 另外还有哪几个呀?您知道吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-5 08:27:07 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-6-5 08:28 编辑
pengfei2010 发表于 2013-6-4 19:35
为什么都说append函数很慢呀,感觉如果只用一次还是很快的  比如(append lst1 lst2 lst3。。。stn 。。。 ...

看表的长度决定是否采用 append,比如 elist 最后附加一个组码,append 既简单也好理解,
[pcode=lisp,true]
(append elist '((60 . 1)))[/pcode]
非要追求效率(这个效率也未经测试)
[pcode=lisp,true]
(reverse (cons '(60 . 1) (reverse elist)))[/pcode]
即使大量(而且这时的量也不会达到巨大)操作,两者的效率想必也可以忽略不计的,所以深入理解后哪个顺手就用哪个
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1336个

财富等级: 财源广进

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 07:09 , Processed in 0.562649 second(s), 64 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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