Ea
发表于 2011-11-11 12:31:46
本帖最后由 Ea 于 2011-11-11 12:33 编辑
(defun getutime ()
(* 86400 (getvar "tdusrtimer"))
)
(defun numb (n / m l)
(setq m 0)
(repeat n
(setq l (cons m l)
m (1+ m)
)
)
l
)
(defun cut (n lst / l)
(repeat (1- n)
(setq l (cons(car lst) l ))
)
(append (reverse l) (cdr lst))
)
(defun c:tt (/ t1 l)
(setq t1 (getutime))
(setq l (numb 15000))
(princ "\nTimes = ")
(princ (- (getutime) t1))
(setq t1 (getutime))
(cut 9999 l)
(princ "\nTimes = ")
(princ (- (getutime) t1))
(princ)
)运行速度和机器配置、是否打开 vlisp 编辑器,CAD运行情况等等都有关系
小菜123
发表于 2011-11-11 13:06:06
牛人都冒出来,最后应当有个结论,表明哪些lisp函数组成的算法速度占优
yjr111
发表于 2011-11-11 13:15:28
红花还需绿叶衬,重在参与哈
Gu_xl
发表于 2011-11-11 14:35:05
本帖最后由 Gu_xl 于 2011-11-11 14:43 编辑
对我的方法3代码再进行优化一下,又快了不少!目前测试是最快的!
;;;方法四
(defun gxl-removeNth3(index lst /rtn len)
(if (< -1 index (setq len (length lst)))
(if (<= index (/ len 2)) ;_ index位于前半截
(progn
(repeat index
(setq rtn (cons (car lst) rtn)
lst (cdr lst)
)
)
(append (reverse rtn) (cdr lst))
)
(progn ;_ index位于后半截
(setq index (- len index 1)
lst (reverse lst)
)
(repeat index
(setq rtn (cons (car lst) rtn)
lst (cdr lst)
)
)
(reverse (append (reverse rtn) (cdr lst)))
)
)
lst ;_ index 越界
)
)
全部测试代码:
测试结果:
命令: tt
Gu_xl 方法一:
用时0.53125秒
Gu_xl 方法二:
用时0.441406秒
Gu_xl 方法三:
用时0.09375秒
Gu_xl 方法四repeat:
用时0.078125秒
duotu007 方法:
用时0.265625秒
xshrimp 方法:
用时0.171875秒
fsxm 方法:
用时0.09375秒
yjr111 test3方法:
用时0.296875秒
xianaihua递归方法:
用时0.21875秒
xianaihua迭代方法:
用时0.234375秒
提高运算速度的方法小结:
1、尽量减少程序运算次数
2、尽量直接使用lisp基本函数,如:car、cdr、cons等,近量少用append、length等函数
3、使用递归等方法,速度相对较慢!比直接使用基本函数计算逊色不少!
fsxm
发表于 2011-11-11 14:36:20
xianaihua 发的那个递归方法很nb,
如果再分下首尾,完美!
cnks
发表于 2011-11-11 15:06:08
Gu_xl 发表于 2011-11-11 14:35 static/image/common/back.gif
对我的方法3代码再进行优化一下,又快了不少!目前测试是最快的!
全部测试代码:
多用car和cdr是正确的,避免使用cons
这是因为编译的原因,car和cdr之类的都是内部函数,而cons是arx定义的函数,这当然比内部函数运行效率低
cnks
发表于 2011-11-11 15:21:28
不好意思,g版,你的没错,查了查cons也是内部函数
xianaihua
发表于 2011-11-11 15:39:21
;;;递归法+
(defun RemoveNth3 (n l)
(defun
RemoveNth
(index lst)
(if(and lst (< 0 index))
(cons (car lst) (RemoveNth (1- index) (cdr lst)))
(cdr lst)
) ;_ 结束if
) ;_ 结束defun
(if (> n
(/ (setq len (length l)) 2)
) ;_ 结束>
(reverse (RemoveNth (- len n 1) (reverse l)))
(RemoveNth n l)
) ;_ 结束defun
) ;_ 结束defun递归改进版,用Gl的测速方法:
Gu_xl 方法一:
用时1.64063秒
Gu_xl 方法二:
用时2.03125秒
Gu_xl 方法三:
用时0.277344秒
Gu_xl 方法四repeat:
用时0.300781秒
duotu007 方法:
用时1.28125秒
xshrimp 方法:
用时0.34375秒
fsxm 方法:
用时0.261719秒
yjr111 test3方法:
用时1.10938秒
xianaihua递归方法:
用时0.191406秒
xianaihua
发表于 2011-11-11 16:07:27
Benchmark显然是有问题的,单个测和几个程序在一起测,差别很大
Gu_xl
发表于 2011-11-11 16:20:49
测速的方法对各种算法的速度是有影响的!比如表的长度不同、删除项的位置不同,各种算法的速度都有影响,测试的结果谁快谁慢也不尽相同!你们可修改24楼测试代码的参数测试下!编译以后再运行结果比较准确!