baitang36 发表于 2022-2-26 12:23:48

【原创】按实现方法给autolisp函数分类

本帖最后由 baitang36 于 2022-2-26 12:44 编辑

autolisp有很多函数,它是怎么做出来的?有的是用c++写的,相当于直接调用c++子程序,速度很快;还有的是用lisp写的,速度慢。举个例子,alert是用c++写成的,自动桌子叫它location类型的函数。princ是用lisp实现的。
我做了个试验,可以把它们分开。
附件文件function.txt的格式是,每行一个函数,函数名在前,后面是类型代码。
类型代码180 和200是location,也就是用c++实现的,速度快。类型代码4是用lisp实现的,速度慢。其它类型未知。如果你想让你的程序速度快,就尽量多用类型码180 和200的函数,少用类型码为4的函数。


baitang36 发表于 2022-2-26 15:23:08

先睹为快,后读免费。没币的朋友在这里下载

baitang36 发表于 2022-3-2 08:23:50

尘缘一生 发表于 2022-3-2 01:08
[*];;Graham扫描法求凸包
[*](defun graham-scan (ptlist / hullpt maxXpt sortPt P Q)
[*](if (<...

cddr的lisp源码是(defun cddr(x)(cdr (cdr x)))
cddr的fas码是 14 01 01 01 00 05 00 29 29 16   
如果cddr直接写成(cdr (cdr x))应该能快一点,因为省去了14 和16指令的执行时间,参数传递的时间也节省了。
我没测试过,你可以弄个测试程序看看有多大差别。

尘缘一生 发表于 2022-3-2 01:08:16

baitang36 发表于 2022-2-26 14:44
用lisp来延伸


[*];;Graham扫描法求凸包
[*](defun graham-scan (ptlist / hullpt maxXpt sortPt P Q)
[*](if (< (length ptlist) 3)            ;3点以下
[*]    ptlist                ;是本集合
[*]    (progn
[*]      (setq maxXpt (assoc (apply 'max (mapcar 'car ptlist)) ptlist));最右边的点
[*]      (setq sortPt (sort-by-angle-distance ptlist maxXpt)) ;分类点集
[*]      (setq hullPt (list (cadr sortPt) maxXpt))      ;开始的两点      
[*]      (foreach &n (cddr sortPt)            ;从第3点开始
[*]      (setq hullPt (cons &n HullPt))          ;把Pi加入到凸集
[*]      (setq P (cadr hullPt))            ;Pi-1
[*]      (setq Q (caddr hullPt))            ;Pi-2
[*]      (while (and q (> (det &n P Q) -1e-6))         ;如果左转
[*]          (setq hullPt (cons &n (cddr hullPt)))         ;删除Pi-1点
[*]          (setq P (cadr hullPt))          ;得到新的Pi-1点
[*]          (setq Q (caddr hullPt))          ;得到新的Pi-2点
[*]      )
[*]      )
[*]      (reverse hullpt);返回凸集
[*]    )
[*])
[*])


把CDDR 改写快点的话,如何改写?

流氓兔 发表于 2022-2-26 12:26:14

牛xx!!!!!!!!!!!!!!!!!!!!!!!

p-3-ianlcc 发表于 2022-2-26 13:00:21

支持…
真是厲害!!

taoyi0727 发表于 2022-2-26 13:06:49

有400多个函数不知道齐了没
CDDDDR 200
CDDDR 200
CDDR 4
CDR 200
不知道为啥就cddr不是C++写的? 有点怪

baitang36 发表于 2022-2-26 13:19:57

本帖最后由 baitang36 于 2022-2-26 13:47 编辑

taoyi0727 发表于 2022-2-26 13:06
有400多个函数不知道齐了没
CDDDDR 200
CDDDR 200

检查了一下,没错,确实如此。
挖了一下, cddr的lisp源码是(defun cddr(x)(cdr (cdr x))

cddr的fas码是 14 01 01 01 00 05 00 29 29 16   


Bao_lai 发表于 2022-2-26 13:21:33

可以搞一个循环的比一下效率差别有多大么?

masterlong 发表于 2022-2-26 13:21:40

满眼看去都是4

baitang36 发表于 2022-2-26 13:51:00

masterlong 发表于 2022-2-26 13:21
满眼看去都是4
说明autolisp很多函数是用它自身开发的。所以慢

guosheyang 发表于 2022-2-26 14:18:18

感谢大神共享!

masterlong 发表于 2022-2-26 14:32:07

baitang36 发表于 2022-2-26 13:51
说明autolisp很多函数是用它自身开发的。所以慢

我们在autolisp的基础上
自定义了无数的函数
没想到的是
autolisp先给自己加了好多戏
页: [1] 2 3
查看完整版本: 【原创】按实现方法给autolisp函数分类