Jump to content

Скорость lisp в автокад и нанокад.


Recommended Posts

Добрый день.

Автокад 21

Нанокад 22

После перевода "самодельной" лисп программы под нанокад - долгое время выполнения программы.

Для исключения проблем в дилетанском коде прилагаюcircle_test.lsp простую тестовую программку.

Время выполнения в автокад: 1 сек.

Время выполенния в нанокад: 12 сек.

Есть ли способ ускорить? (Может системные переменные какие либо?)

Всем ответившим заранее спасибо.

 

Link to comment
Share on other sites

Командные методы вообще самые медленные. Но, что самое интересное, замена на entmakex ситуацию не сильно меняет :(

Спойлер
(vl-load-com)
(defun t1 (/ start adoc x y elist step radius end )
  (setq start (getvar "cdate"))
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (setq x 0.
        y 0.
        step 5.
        radius 4.
  ) ;_ end of setq
  (while (<= x 1000.)
    (while (<= y 1000.)
      (setq elist (cons
                    (entmakex (list (cons 0 "CIRCLE")
                                    (cons 10 (list x y))
                                    (cons 40 radius)
                              ) ;_ end of list
                    ) ;_ end of entmakex
                    elist
                  ) ;_ end of cons
      ) ;_ end of setq
      (setq y (+ step y))
    ) ;_ end of while
    (setq x (+ step x)
          y 0.
    ) ;_ end of setq
  ) ;_ end of while

  (foreach item elist (entdel item))
  (vla-endundomark adoc)
  (setq end (- (getvar "cdate") start)
        end (* 86400. (- end (fix end)))
  ) ;_ end of setq
  (princ end)
  (princ)
) ;_ end of defun

 

Результаты:

ACAD2013 0.107

ACAD2020 0.098

nanoCAD 20 7.715

nanoCAD 23 3.872

 

Может быть, будет иметь смысл сначала создавать описание анонимного блока, в нем сразу все создавать, а потом вставлять этот блок и тут же его разбивать.

Link to comment
Share on other sites

офф .NET похожая ситуация, нк медленнее в разы, правда нк23 не тестировал ибо в текущей ситуации это не имеет смысла

Link to comment
Share on other sites

Попробовал, но категорической разницы не получил. nanoCAD 23 выдал 0.543, что лучше - но все еще далековато.

Link to comment
Share on other sites

Хм...

41 минуту назад, kpblc сказал:

Командные методы вообще самые медленные. Но, что самое интересное, замена на entmakex ситуацию не сильно меняет :(

  Переделанный код (Показать контент)

(vl-load-com) (defun t1 (/ start adoc x y elist step radius end ) (setq start (getvar "cdate")) (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object)))) (setq x 0. y 0. step 5. radius 4. ) ;_ end of setq (while (<= x 1000.) (while (<= y 1000.) (setq elist (cons (entmakex (list (cons 0 "CIRCLE") (cons 10 (list x y)) (cons 40 radius) ) ;_ end of list ) ;_ end of entmakex elist ) ;_ end of cons ) ;_ end of setq (setq y (+ step y)) ) ;_ end of while (setq x (+ step x) y 0. ) ;_ end of setq ) ;_ end of while (foreach item elist (entdel item)) (vla-endundomark adoc) (setq end (- (getvar "cdate") start) end (* 86400. (- end (fix end))) ) ;_ end of setq (princ end) (princ) ) ;_ end of defun

(vl-load-com)
(defun t1 (/ start adoc x y elist step radius end )
  (setq start (getvar "cdate"))
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (setq x 0.
        y 0.
        step 5.
        radius 4.
  ) ;_ end of setq
  (while (<= x 1000.)
    (while (<= y 1000.)
      (setq elist (cons
                    (entmakex (list (cons 0 "CIRCLE")
                                    (cons 10 (list x y))
                                    (cons 40 radius)
                              ) ;_ end of list
                    ) ;_ end of entmakex
                    elist
                  ) ;_ end of cons
      ) ;_ end of setq
      (setq y (+ step y))
    ) ;_ end of while
    (setq x (+ step x)
          y 0.
    ) ;_ end of setq
  ) ;_ end of while

  (foreach item elist (entdel item))
  (vla-endundomark adoc)
  (setq end (- (getvar "cdate") start)
        end (* 86400. (- end (fix end)))
  ) ;_ end of setq
  (princ end)
  (princ)
) ;_ end of defun

 

Результаты:

ACAD2013 0.107

ACAD2020 0.098

nanoCAD 20 7.715

nanoCAD 23 3.872

 

Может быть, будет иметь смысл сначала создавать описание анонимного блока, в нем сразу все создавать, а потом вставлять этот блок и тут же его разбивать.

У меня код kpblc в Автокад 0,17 сек

в Нанокад показывает 26,0 сек

Но реально "думал" более двух минут.

Link to comment
Share on other sites

56 минут назад, kpblc сказал:

Но, что самое интересное, замена на entmakex ситуацию не сильно меняет :(

Странно.

Спойлер

image.png.e187002d659373301f2df6c5072a10a2.png

.

 

Спойлер

(defun c:t1 ( / )
(defun Circle (cen rad)
 (entmakex (list (cons 0 "CIRCLE")
                 (cons 10 cen)
                 (cons 40 rad))))
(setq start (getvar "date"))

(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)

(setq i 0 j 0)
(repeat 100

 

;Комментируем одну из следующих строк
(command "_.circle" (list i j) 1)
;(circle (list i j) 1)

 

(setq i (+ 5 i) j (+ 5 j))
  )

(command "_.zoom" (list 0 0) (list 495 495))
(setvar "OSMODE" osm)
(setq end (getvar "date"))
(setq s (- end start))
(setq seconds (* 86400.0 (- s (fix s))))
)

 

Поменьше функции (command и vba-примочек и все будет хорошо/

 

ЗЫ.

Кстати, протестил в АС14. Разница между АС и NC - приблизительно на порядок (в пользу АС).

Соотношение между (command и (entmakex - одинаково в АС и NC

Edited by EdwardSt
Link to comment
Share on other sites

Похоже, на скорость выполнения может влиять что угодно. Сейчас прогнал оба своих варианта на ACAD2020 (правда, в файле полно мусора): t1 - 0.432, t3 - 0.778

Спойлер
(vl-load-com)
(defun t3 (/ adoc start end x y blk_def blk_ref)
  (setq start   (getvar "cdate")
        adoc    (vla-get-activedocument (vlax-get-acad-object))
        blk_def (vla-add (vla-get-blocks adoc) (vlax-3d-point '(0. 0. 0.)) "*U")
        x       0.
        y       0.
        step    5.
        radius  4.
  ) ;_ end of setq
  (while (< x 1000.)
    (while (< y 1000.)
      (vla-addcircle blk_def (vlax-3d-point (list x y)) radius)
      (setq y (+ y step))
    ) ;_ end of while
    (setq x (+ x step)
          y 0.
    ) ;_ end of while
  ) ;_ end of while

  (setq blk_ref (vla-insertblock
                  (vla-get-modelspace adoc)
                  (vlax-3d-point '(0. 0. 0.))
                  (vla-get-name blk_def)
                  1.
                  1.
                  1.
                  0.
                ) ;_ end of vla-InsertBlock
  ) ;_ end of setq
  (vla-explode blk_ref)
  (vla-delete blk_ref)
  (setq end (- (getvar "cdate") start)
        end (* 86400. (- end (fix end)))
  ) ;_ end of setq
  (princ end)
  (princ)
) ;_ end of defun

 

Ничего не понимаю (с)

Link to comment
Share on other sites

2 минуты назад, kpblc сказал:

Ничего не понимаю (с)

 

Поделюсь своими субъективными подозрениями.

функции vla- vlax-  тоже сильно замедляют код именно в среде NC.

Наверное, это связано с особенностями объектной модели. Поддержка этих функций для обеспечения совместимости требует дополнительного преобразования из одной объектной модели в другую (ну, не совсем так, но типа...).

В общем, я стараюсь использовать все, что следует за vl-load-com (т.е. обращения к объектной модели) только там, где это действительно необходимо.

Ну и универсальность кода при этом более высокая.

Хотя не исключаю, что на более низком уровне функции классического лиспа так же преобразуются в обращения к объектной модели NC и  мои подозрения безосновательны.

Link to comment
Share on other sites

Не, чисто теоретически можно и без ActiveX создать описание блока и в него все засовывать, но я уже не помню подобных подробностей: слишком давно игрался. Насколько я помню, entmake(x) - методы в некомпилированном лиспе будут самыми быстрыми. Но ActiveX позволяет писать более удобочитаемый (ИМХО) код.

 

  • Like 1
  • Thanks 1
Link to comment
Share on other sites

5 минут назад, kpblc сказал:

Насколько я помню, entmake(x) - методы в некомпилированном лиспе будут самыми быстрыми. Но ActiveX позволяет писать более удобочитаемый (ИМХО) код.

За ссылку спасибо. Лишний раз укрепился во мнении, что использовать нужно инструменты, наиболее подходящие именно в данной ситуации.

Разница между этмэйком и командными методами видна невооруженным глазом уже при отрисовке нескольких (кстати, не особенно большом количестве) элементов. Разница между этмэйком и влафункциями уже требует замеров с секундомером и часто невооруженным глазом незаметна.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт Разработка? Tell a friend!
×
×
  • Create New...