明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2867|回复: 24

[讨论] 大家一起来玩优化,用最短的时间画一个bmp图片

[复制链接]
发表于 2022-6-14 15:12:50 | 显示全部楼层 |阅读模式
本帖最后由 baitang36 于 2022-6-14 15:47 编辑

下面函数c:tt的作用是画一个图片,把tt.txt中的像素数据画到坐标0,0处。
现有程序大约需要十几秒时间,有时间玩的朋友优化一下,看看谁的程序最快。
像素数据是用高飞鸟的工具提取的。
  1. (defun c:tt(/ pt r x lst x1 x2)
  2.            (setq f (open "c:/00/tt.txt" "R")))
  3. (setq t0  (getvar "TDUSRTIMER" ) )
  4.       (while (setq s (read-line f))
  5.         (setq k (read s))
  6.         (if (and k (= (type k) (quote LIST)) (= (length k) 6))
  7.           (progn
  8.             (setq x (car k)
  9.                   y (cadr k)
  10.                   r (caddr k)
  11.                   g (cadddr k)
  12.                   b (car (cddddr k))
  13.                   c (lm:rgb->true r g b)
  14.                   )
  15.             (entmake
  16.                 (list
  17.                   (cons 0 "LWPOLYLINE")
  18.                   (cons 100 "AcDbEntity")
  19.                   (cons 100 "AcDbPolyline")
  20.                   (cons 8 "Image2PL")
  21.                   (cons 90 2)
  22.                   (cons 43 1.0)
  23.                   (cons 420 c)
  24.                   (cons 10 (list x y))
  25.                   (cons 10 (list (1+ x) y))
  26.                   )))
  27.       (close f)
  28. (princ "\n程序共用时" )
  29. (princ  (*  (-  (getvar "TDUSRTIMER" )  t0 )  86400 )  )
  30. (princ "秒" )
  31. (princ)
  32. )

  33. (defun LM:RGB->True ( r g b )
  34.   (+
  35.     (lsh (fix r) 16)
  36.     (lsh (fix g)  8)
  37.     (fix b)
  38.   )
  39. )




本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
guosheyang + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2022-6-15 08:53:11 | 显示全部楼层
本帖最后由 baitang36 于 2022-6-15 09:34 编辑


;用上一个保留函数 syz-read-list
;改成这样后是7.784秒,改前是10.3秒

(defun c:tt (/ pt r x lst x1 x2 r g b c lc strc )
(setq f (open "c:/00/tt.txt" "R"))
(setq f1 (open "c:/00/tt6.txt" "w"))
(setq list1 nil)
(while (setq s (read-line f))
  (setq k (read s))
     (setq
            r (caddr k)
            g (cadddr k)
            b (car (cddddr k))
            c (lm:rgb->true r g b)
      )

(setq list1 (cons c list1 ))
)
(setq list1 (reverse list1))
(setq strc (vl-prin1-to-string list1))
(write-line strc f1)
(close f1)
(close f)

(setq f (open "c:/00/tt6.txt" "R"))
(setq t0 (getvar "TDUSRTIMER"))
(load "c:/00/syz-read-list.fas")
(setq lc (syz-read-list f))
(setq x 0 y 0)
(while  (< x 512 ) ;宽512像素   ;while比repeat快0.1秒
  (while (< y 654) ;高654像素
  (setq c (car lc))
  (setq lc(cdr lc))
    (entmake
      (list
        (cons 0 "LWPOLYLINE")
        (cons 100 "AcDbEntity")
        (cons 100 "AcDbPolyline")
        (cons 8 "Image2PL")
        (cons 90 2)
        (cons 43 1.0)
        (cons 420 c)
        (cons 10 (list x y))
        (cons 10 (list (+ 1 x) y))
      )
    )
    (setq y (+ 1 y))
  )
  (setq y 0)
  (setq x (+ 1 x))
)
(close f)
(princ "\n程序共用时" )
(princ  (*  (-  (getvar "TDUSRTIMER" )  t0 )  86400 )  )
(princ "秒" )
(princ)
)

(defun LM:RGB->True ( r g b )
  (+
    (lsh r 16)
    (lsh g  8)
    b
  )
)
;(vlisp-compile 'st "c:/00/tt.lsp")

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-6-15 08:31:54 | 显示全部楼层
本帖最后由 baitang36 于 2022-6-15 08:36 编辑

;改成一张大表,节省了读文件时间,总的反而慢了
;改成这样后是8.386秒,改前是10.3秒

(defun c:tt (/ pt r x lst x1 x2 r g b c lc strc )
(setq f (open "c:/00/tt.txt" "R"))
(setq f1 (open "c:/00/tt6.txt" "w"))
(setq list1 nil)
(while (setq s (read-line f))
  (setq k (read s))
     (setq
            r (caddr k)
            g (cadddr k)
            b (car (cddddr k))
            c (lm:rgb->true r g b)
      )

(setq list1 (cons c list1 ))
)
(setq list1 (reverse list1))
(setq strc (vl-prin1-to-string list1))
(write-line strc f1)
(close f1)
(close f)

(setq f (open "c:/00/tt6.txt" "R"))
(setq t0 (getvar "TDUSRTIMER"))
(setq s (read-line f))
(setq lc (read s))
(setq x 0 y 0)
(while  (< x 512 ) ;宽512像素   ;while比repeat快0.1秒
  (while (< y 654) ;高654像素
  (setq c (car lc))
    (entmake
      (list
        (cons 0 "LWPOLYLINE")
        (cons 100 "AcDbEntity")
        (cons 100 "AcDbPolyline")
        (cons 8 "Image2PL")
        (cons 90 2)
        (cons 43 1.0)
        (cons 420 c)
        (cons 10 (list x y))
        (cons 10 (list (+ 1 x) y))
      )
    )
    (setq y (+ 1 y))
  )
  (setq y 0)
  (setq x (+ 1 x))
)
(close f)
(princ "\n程序共用时" )
(princ  (*  (-  (getvar "TDUSRTIMER" )  t0 )  86400 )  )
(princ "秒" )
(princ)
)

(defun LM:RGB->True ( r g b )
  (+
    (lsh r 16)
    (lsh g  8)
    b
  )
)
;(vlisp-compile 'st "c:/00/tt.lsp")

本帖子中包含更多资源

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

x
发表于 2022-6-14 16:29:28 | 显示全部楼层
一直以为entmake是最快的,您这个应该就是最快的了。
是不是可以不用判断(if (and k (= (type k) (quote LIST)) (= (length k) 6)),以便于加速?
发表于 2022-6-14 16:49:31 | 显示全部楼层
你的电脑配置高,我这里:程序共用时60.748秒
 楼主| 发表于 2022-6-14 21:08:44 | 显示全部楼层
本帖最后由 baitang36 于 2022-6-14 21:18 编辑
自贡黄明儒 发表于 2022-6-14 16:29
一直以为entmake是最快的,您这个应该就是最快的了。
是不是可以不用判断(if (and k (= (type k) (quote L ...

试试,这句是考虑数据文件的第一行写点别的,注释什么的.
去掉前6.198秒,去掉后5.991秒
 楼主| 发表于 2022-6-14 21:11:32 | 显示全部楼层
菜卷鱼 发表于 2022-6-14 16:49
你的电脑配置高,我这里:程序共用时60.748秒

我电脑的cpu主频4.5G的i5,acad2008用时10.3秒。acad2018是17秒,2022是19秒
 楼主| 发表于 2022-6-14 21:26:37 | 显示全部楼层
本帖最后由 baitang36 于 2022-6-16 09:24 编辑

;改成这样后是5.723秒,改前是6.198秒 这是另一台电脑的测试,6.198面相当于一楼的10.3秒

(defun c:tt (/ pt r x lst x1 x2)
  (setq f (open "c:/00/tt.txt" "R"))

(setq t0 (getvar "TDUSRTIMER"))
(while (setq s (read-line f))
  (setq k (read s))
  
   
      (setq x (car k)
            y (cadr k)
            r (caddr k)
            g (cadddr k)
            b (car (cddddr k))
            c (lm:rgb->true r g b)
      )
      (entmake
        (list
          (cons 0 "LWPOLYLINE")
          (cons 100 "AcDbEntity")
          (cons 100 "AcDbPolyline")
          (cons 8 "Image2PL")
          (cons 90 2)
          (cons 43 1.0)
          (cons 420 c)
          (cons 10 (list x y))
          (cons 10 (list (+ 1 x) y))
        
      
    )
  )
)
(close f)
(princ "\n程序共用时" )
(princ  (*  (-  (getvar "TDUSRTIMER" )  t0 )  86400 )  )
(princ "秒" )
(princ)
)

(defun LM:RGB->True ( r g b )
  (+
    (lsh r 16)
    (lsh g  8)
    b
  )
)
;(vlisp-compile 'st "c:/00/tt.lsp")
 楼主| 发表于 2022-6-15 07:51:55 | 显示全部楼层
本帖最后由 baitang36 于 2022-6-15 07:55 编辑

;先处理一下像素数据文件,省去计算过程
;改成这样后是8.157秒,改前是10.3秒

(defun c:tt (/ pt r x lst x1 x2 r g b c lc strc )
  (setq f (open "c:/00/tt.txt" "R"))
(setq f1 (open "c:/00/tt4.txt" "w"))
(while (setq s (read-line f))
  (setq k (read s))
     (setq
            r (caddr k)
            g (cadddr k)
            b (car (cddddr k))
            c (lm:rgb->true r g b)
      )
(setq strc (vl-prin1-to-string c))
(write-line strc f1)
)
(close f1)
(close f)

(setq f (open "c:/00/tt4.txt" "R"))
(setq t0 (getvar "TDUSRTIMER"))
(setq x 0 y 0)
(while  (< x 512 ) ;宽512像素   ;while比repeat快0.1秒
  (while (< y 654) ;高654像素
    (setq s (read-line f))
    (setq c (read s))
    (entmake
      (list
        (cons 0 "LWPOLYLINE")
        (cons 100 "AcDbEntity")
        (cons 100 "AcDbPolyline")
        (cons 8 "Image2PL")
        (cons 90 2)
        (cons 43 1.0)
        (cons 420 c)
        (cons 10 (list x y))
        (cons 10 (list (+ 1 x) y))    ;(+ 1 x)比(1+ x)略快
      )
    )
    (setq y (+ 1 y))
  )
  (setq y 0)
  (setq x (+ 1 x))
)
(close f)
(princ "\n程序共用时" )
(princ  (*  (-  (getvar "TDUSRTIMER" )  t0 )  86400 )  )
(princ "秒" )
(princ)
)

(defun LM:RGB->True ( r g b )
  (+
    (lsh r 16)
    (lsh g  8)
    b
  )
)
;(vlisp-compile 'st "c:/00/tt.lsp")
发表于 2022-6-15 08:15:32 | 显示全部楼层
看到了LM: ,回头试一下
发表于 2022-6-15 08:25:30 | 显示全部楼层
楼主雄才!
期待楼主做一个在DCL窗口中预览dwg的插件
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 17:26 , Processed in 0.209664 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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