明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6055|回复: 27

[讨论] 如何提升此程序运行的速度?

  [复制链接]
发表于 2013-3-11 10:05 | 显示全部楼层 |阅读模式
50明经币
(defun c:myqrcode ()
  (setq        str
         "1111111011101101001111111-1000001011100101001000001-1011101010110110001011101-1011101011010011001011101-1011101000000110101011101-1000001010011101101000001-1111111010101010101111111-0000000001001100000000000-1100111000010011000101111-0111110111101100101001110-1001101000011010010101011-0101010110110111001111001-1101111100101100110100111-1111010100000001001111110-0000011111000000101000101-0000000111001100111000001-1110101100010011111110001-0000000011101100100011101-1111111000111111101010101-1000001010010110100011001-1011101011101011111110111-1011101001100001110110111-1011101001100011010111110-1000001010101011001101010-1111111011111111110011111"
  )
  (setq strlst (split str "-"))
  (YTM-QRCODE strlst (getpoint))
  (redraw)
  (vl-cmdf "zoom" "e")
)
(defun YTM-QRCODE
       (strlst pt / YTM-solid str->lst pt-xlst pt-ylst x y m n)
  (defun YTM-solid (pt flag / os)
    (setq os (getvar "osmode"))
    (setvar "osmode" 0)
    (if        (= flag "1")
      (entmake (list (cons 0 "SOLID")
                     (cons 8 "0")
                     (cons 10 pt)
                     (cons 11 (polar pt 0 1))
                     (cons 12 (polar pt (* 1.5 pi) 1))
                     (cons 13 (polar (polar pt 0 1) (* 1.5 pi) 1))
                     (cons 62 0)
               )
      )
    )
    (setvar "osmode" os)
  )
  (defun str->lst (str / i istr strlst)
    (setq i 1
          strlst '()
    )
    (repeat (strlen str)
      (setq istr (substr str i 1))
      (setq strlst (cons istr strlst))
      (setq i (1+ i))
    )
    (reverse strlst)
  )
  (defun pt-xlst (pt n / i xlst pt1)
    (setq i    0
          xlst '()
    )
    (repeat n
      (setq pt1 (polar pt 0 (* i 1)))
      (setq xlst (cons pt1 xlst))
      (setq i (1+ i))
    )
    (reverse xlst)
  )
  (defun pt-ylst (pt n / i ylst pt1)
    (setq i    0
          xlst '()
    )
    (repeat n
      (setq pt1 (list (car pt) (- (cadr pt) (* i 1))))
      (setq ylst (cons pt1 ylst))
      (setq i (1+ i))
    )
    (reverse ylst)
  )
  (setq        strlst (mapcar '(lambda        (x)
                          (str->lst x)
                        )
                       strlst
               )
  )
  (setq        x (length strlst)
        y (length (nth 0 strlst))
  )
  (princ x)
  (princ y)
  (if (= x y)
    (setq ptlst        (mapcar        '(lambda (z)
                           (pt-xlst z x)
                         )
                        (pt-ylst pt y)
                )
    )
  )
  (setq        lastlst        (mapcar        '(lambda (x y)
                           (mapcar '(lambda (x1 y1)
                                      (list x1 y1)
                                    )
                                   x
                                   y
                           )
                         )
                        ptlst
                        strlst
                )
  )
  (foreach n lastlst
    (foreach m n
      (YTM-solid (car m) (cadr m))
    )
  )
)
;;-------------------------------------------------------;;    Split a string;;-------------------------------------------------------(defun split (str                        ; string to split              cara                        ; separator              /        n portion xstring seqstart chrcode portion)  (cond    ((and (= (type str) (type cara) 'STR) (eq (strlen cara) 1))     (setq n            -1           seqstart 1           chrcode  (ascii cara)     )     (while (setq n (vl-string-position chrcode str (+ n 1) nil))       (setq xstring  (append xstring                              (list (substr str seqstart (- n seqstart -1)))                      )             seqstart (+ n 2)       )     )     (setq xstring (append xstring (list (substr str seqstart))))     (if xstring       xstring       (list str)     )    )    ((= (type str) (type cara) 'STR)     (setq portion ""           n 1     )     (if (<= (strlen cara) (strlen str))       (progn         (while        (<= n (strlen str))           (if (eq (substr str n (strlen cara)) cara)             (setq xstring (append xstring (list portion))                   portion ""                   n           (+ n (strlen cara))             )             (setq portion (strcat portion (substr str n 1))                   n           (+ 1 n)             )           )         )         (if           (or (> (strlen portion) 0)               (eq (substr str (abs (- (strlen str) (strlen cara) -1)))                   cara               )           )            (setq xstring (append xstring (list portion)))         )       )       (setq xstring (list str))     )     (if xstring       xstring       (list "")     )    )    (T (list nil))  ))
目前程序运行比较慢,请教如何才有提高运行速度?如果想查看此二维码中的信息,请将CAD的背景调成白色(选项,显示,颜色)或打印出来后进行解码,不然黑色背景是无法解码的。

最佳答案

查看完整内容

仅仅是根据数组画图,应该是不难的,我写了一段代码,可以看看是不是你要的。
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-3-11 10:05 | 显示全部楼层
革天明 发表于 2013-3-14 18:00
看下我最后更新的子函数,感觉不到速度上的延迟

仅仅是根据数组画图,应该是不难的,我写了一段代码,可以看看是不是你要的。

  1. (defun c:tt()
  2.   (setq        str
  3.          "1111111011101101001111111-1000001011100101001000001-1011101010110110001011101-1011101011010011001011101-1011101000000110101011101-1000001010011101101000001-1111111010101010101111111-0000000001001100000000000-1100111000010011000101111-0111110111101100101001110-1001101000011010010101011-0101010110110111001111001-1101111100101100110100111-1111010100000001001111110-0000011111000000101000101-0000000111001100111000001-1110101100010011111110001-0000000011101100100011101-1111111000111111101010101-1000001010010110100011001-1011101011101011111110111-1011101001100001110110111-1011101001100011010111110-1000001010101011001101010-1111111011111111110011111"
  4.   )
  5.   (setq pt0 (getpoint "\n二维码左上角:"))
  6.   (setq pt0 (polar (polar pt0 (/ pi 2) 0.5) pi 1.0))
  7.   (setq str0 str
  8. ls1 nil
  9.   )
  10.   (while (wcmatch str0 "*-*")
  11.     (setq n (vl-string-search "-" str0)
  12.    ls1 (cons (substr str0 1 n) ls1)
  13.    str0(substr str0 (+ 2 n))
  14.     )
  15.   )
  16.   (setq ls1 (reverse (cons str0 ls1))
  17. ls1 (mapcar 'vl-string->list ls1))
  18.   (mapcar
  19.     '(lambda(y)
  20.        (setq pt1 (polar pt0 (/ pi -2) 1.0)
  21.       pt0 pt1
  22.        )
  23.        (mapcar
  24.   '(lambda(x)
  25.      (setq pt1 (polar pt1 0.0 1.0))
  26.      (if (= x 49)
  27.        (mkpl pt1)
  28.      )
  29.    )
  30.   y
  31.        )
  32.      )
  33.     ls1
  34.   )
  35.   (princ)
  36. )
  37. (defun mkpl(pt)
  38.   (entmake (list '(0 . "lwpolyline")
  39.    '(100 . "AcDbEntity")
  40.    '(100 . "AcDbPolyline")
  41.    '(90 . 2)
  42.    '(43 . 1.0)
  43.    (cons 10 pt)
  44.    (cons 10 (polar pt 0.0 1.0))
  45.     )
  46.   )
  47. )

点评

牛啊,确实很神速,看来我最初的那种生成solid的方式弱爆了,一个块要0.015秒的时间  发表于 2013-3-15 12:34
果然很神速!!  发表于 2013-3-15 12:31

评分

参与人数 2明经币 +2 收起 理由
zctao1966 + 1 很给力!
革天明 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-3-11 11:14 | 显示全部楼层
本帖最后由 xiaxiang 于 2013-3-11 11:19 编辑

替换split函数试试

  1. (defun split  (source chars)
  2. (mapcar (function (lambda (m n) (substr source (+ 2 m) (- n m 1))))
  3.          (cons -1
  4.                (setq chars
  5.                       (vl-sort
  6.                         (apply
  7.                           'append
  8.                           (mapcar
  9.                             (function (lambda (code / result n)
  10.                                         (setq n -1)
  11.                                         (while (setq n (vl-string-position
  12.                                                          code
  13.                                                          source
  14.                                                          (1+ n)))
  15.                                           (setq result (cons n result)))
  16.                                         result))
  17.                             (vl-string->list chars)))
  18.                         '<)))
  19.          (append chars (list (strlen source)))))

回复

使用道具 举报

发表于 2013-3-11 11:41 | 显示全部楼层
本帖最后由 阿然 于 2013-3-11 11:44 编辑

我也贴个lee大的split
  1. ;;字符串=>字条串列表 By Lee Mac
  2. ;;(BAtte:str->lst "A,B" ",")返回("A" "B")
  3. (defun BAtte:str->lst (str del / pos)
  4.   (if (setq pos (vl-string-search del str))
  5.     (cons (substr str 1 pos)
  6.           (BAtte:str->lst (substr str (+ pos 1 (strlen del))) del)
  7.     )
  8.     (list str)
  9.   )
  10. )

关于这个二维码,我的想法是不管三七二十八,所有的小solid阵列全画出来,然后根据二维码数据,控制小solid的visable就可以了,这样速度应该更快。
回复

使用道具 举报

 楼主| 发表于 2013-3-11 11:41 | 显示全部楼层
本帖最后由 革天明 于 2013-3-11 11:42 编辑
xiaxiang 发表于 2013-3-11 11:14
替换split函数试试

应该不是这个函数,是生成solid的有问题,此例中使用了entmake来生成solid,但是还是速度慢,不知道是什么原因
回复

使用道具 举报

发表于 2013-3-11 11:44 | 显示全部楼层
本帖最后由 xiaxiang 于 2013-3-11 11:44 编辑
革天明 发表于 2013-3-11 11:41
应该不是这个函数,是生成solid的有问题,此例中使用了entmake来生成solid,但是还是速度慢,不知道是什么 ...


已经测试不生成solid就不慢了吗?
回复

使用道具 举报

发表于 2013-3-11 11:44 | 显示全部楼层
革天明 发表于 2013-3-11 11:41
应该不是这个函数,是生成solid的有问题,此例中使用了entmake来生成solid,但是还是速度慢,不知道是什么 ...

关于这个二维码,我的想法是不管三七二十八,所有的小solid阵列全画出来,然后根据二维码数据,控制小solid的visable就可以了,这样速度应该更快
回复

使用道具 举报

 楼主| 发表于 2013-3-11 11:47 | 显示全部楼层
xiaxiang 发表于 2013-3-11 11:44
已经测试不生成solid就不慢了吗?

你说的对,
(if        (= flag "1")
;;;      (entmake (list (cons 0 "SOLID")
;;;                     (cons 8 "0")
;;;                     (cons 10 pt)
;;;                     (cons 11 (polar pt 0 1))
;;;                     (cons 12 (polar pt (* 1.5 pi) 1))
;;;                     (cons 13 (polar (polar pt 0 1) (* 1.5 pi) 1))
;;;                     (cons 62 0)
;;;               )
;;;      )
      (princ)
    )
现在还是慢,我得仔细研究一下哪个环节造成的运行速度慢
回复

使用道具 举报

 楼主| 发表于 2013-3-11 11:48 | 显示全部楼层
如何测试程序在某段代码的运行时间?
回复

使用道具 举报

发表于 2013-3-11 11:57 | 显示全部楼层
革天明 发表于 2013-3-11 11:48
如何测试程序在某段代码的运行时间?

用benchmark,用法里面有说明

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-4 07:53 , Processed in 0.276417 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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