乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 155|回复: 5

关于lisp内部数据类型vector的小测试

[复制链接]

56

主题

346

帖子

68

银币

中流砥柱

Rank: 25

铜币
512
发表于 2022-7-13 02:13:00 | 显示全部楼层 |阅读模式
起源于的这个帖子 :
我把vector和list两种数据类型的读取元素的速度进行了比较。
测试代码:
  1. (defun c:ttt()
  2.   (setq i 0)
  3.   (setq l nil)
  4.   (setq n 100000)
  5.   (repeat n
  6.     (setq l (cons i l))
  7.     (setq i (1+ i))
  8.   )
  9.   (setq v (apply 'vector l))
  10.   ;;最后一个元素
  11.   (uti:bench 10000
  12.     (list
  13.       (list 'vector-elt v (1- n))
  14.       (list 'nth (1- n) l)
  15.     )
  16.   )
  17.   ;;第一个元素
  18.   (uti:bench 10000
  19.     (list
  20.       (list 'vector-elt v 0)
  21.       (list 'nth 0 l)
  22.     )
  23.   )
  24.   ;;中间元素
  25.   (uti:bench 10000
  26.     (list
  27.       (list 'vector-elt v (/ n 2))
  28.       (list 'nth (/ n 2) l)
  29.     )
  30.   )
  31.   (defun forvector (v / i)
  32.     (setq i 0)
  33.     (repeat (vector-length v)
  34.       (vector-elt v i)
  35.       (setq i (1+ i))
  36.     )
  37.   )
  38.   (defun forList (lst / i)
  39.     (setq i 0)
  40.     (repeat (length lst)
  41.       (nth i lst)
  42.       (setq i (1+ i))
  43.     )
  44.   )
  45.   
  46.   ;;平均用时
  47.   (uti:bench 10
  48.     (list
  49.       (list 'forvector v)
  50.       (list 'forlist l)
  51.     )
  52.   )
  53.    
  54.   (princ)
  55. )

测试函数:
  1. (defun UTI:Bench (Times Expressions / s)
  2.   (defun Benchmark (Func times / TIME0 TIME1 Speed Value fName)
  3.     (setq fName (car Func))
  4.     (setq TIME0 (getvar "millisecs"))
  5.     (repeat times
  6.       (setq Value (apply fName (cdr func)))
  7.     )
  8.     (setq TIME1 (getvar "millisecs"))
  9.     (setq TIME1 (- TIME1 TIME0 0.0))
  10.     (setq Speed (/ TIME1 times))
  11.     (list fName times TIME1 Speed Value)
  12.   )
  13.   (BenchCommon Times Expressions)
  14. )
在我的笔记本上测试的结果是:
Statement                Times     Elapse(ms)     Average(ms/time)
------------------------------------------------------------------
VECTOR-ELT               10000     468.0          0.0468
NTH                      10000     3063.0         0.3063
Statement                Times     Elapse(ms)     Average(ms/time)
------------------------------------------------------------------
VECTOR-ELT               10000     782.0          0.0782
NTH                      10000     828.0          0.0828
Statement                Times     Elapse(ms)     Average(ms/time)
------------------------------------------------------------------
VECTOR-ELT               10000     829.0          0.0829
NTH                      10000     2062.0         0.2062
Statement                Times     Elapse(ms)     Average(ms/time)
------------------------------------------------------------------
FORVECTOR                10        4547.0         454.7
FORLIST                  10        126953.0       12695.3
读取单个元素的时候,vector优势不是很明显,但平均值优势比较大。
另外vector有一个优点,就是很容易改变某个元素的值或者替换和交换元素,这个是很方便的,对list类型来说,实在不好办。
所以此处我没做比较。
欢迎大家测试。
回复

使用道具 举报

188

主题

1652

帖子

31

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2391
发表于 2022-7-13 07:18:00 | 显示全部楼层
我看过一篇文章,很长很长,只记得说字典也是很神奇的
;;利用字典去重复
(defun C:w1 (/ *DIC*)
  (or *dic*
      (setq *dic* (vlax-get-or-create-object "scripting.dictionary"))
  )
;;;; Methods supported:
;;;;   Add (2)
;;;;   Exists (1)
;;;;   Items ()
;;;;   Keys ()
;;;;   Remove (1)
;;;;   RemoveAll ()
  (vlax-invoke *dic* 'add "a" "a");=>nil
  (vlax-invoke *dic* 'add "b" "1")
  (vlax-invoke *dic* 'Exists "b");存在=-1,不存在为0
  
  (vlax-invoke *dic* 'Keys);=>("a" "b")
  (vlax-invoke *dic* 'Items);=>("a" "1")
  
  (vlax-invoke *dic* 'Remove "a");=>nil
  (vlax-invoke *dic* 'Keys);=>("b")
  (vlax-invoke *dic* 'RemoveAll);=>nil
  (vlax-invoke *dic* 'Keys);nil
)
;;字典去重复
;;(RE '(1 2 3 3 2 1));=>(1 2 3)
(defun RE (lis / A NEW)
  (or *dic*
      (setq *dic* (vlax-get-or-create-object "scripting.dictionary"))
  )
  (while (setq a (car lis))
    (setq lis (cdr lis))
    (if        (= (vlax-invoke *dic* 'Exists a) 0)
      (vlax-invoke *dic* 'add a "")
    )
  )
  (setq New (vlax-invoke *dic* 'Keys))
  (vlax-invoke *dic* 'RemoveAll)
  New
)
回复

使用道具 举报

15

主题

227

帖子

20

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
276
发表于 2022-7-13 07:51:00 | 显示全部楼层
感谢两位大佬的分享!
回复

使用道具 举报

122

主题

647

帖子

223

银币

版主

Rank: 10Rank: 10

铜币
1174
发表于 2022-7-13 08:45:00 | 显示全部楼层
有一个保留函数 nth<-可以很方便的替换表中的某个元素。
用法是:(syz-nth<- 序号  值  表 )
序号和nth的用法一样,从0开始算
回复

使用道具 举报

18

主题

158

帖子

12

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
225
发表于 2022-7-13 09:18:00 | 显示全部楼层
除了点赞,我啥也不会
回复

使用道具 举报

7

主题

45

帖子

18

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
63
发表于 2022-7-13 19:41:00 | 显示全部楼层
给高手点赞 + 佩服,给力
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-4 01:29 , Processed in 1.298725 second(s), 64 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表