Comparaison-command-entmake-vla

Analyse de quatre méthodes
de création d'entité


Mesure de la vitesse de création


Quand on programme on a toujours en tête de gagner du temps et pour gagner du temps il faut pouvoir mesurer ce gain en fonction de la méthode utilisée.

Dans cette page vous trouverez quatre méthodes chronométrées de création de lignes,
création de deux mille lignes pour être précis.
ces quatre méthodes sont :

  1. command avec messages
  2. command sans message
  3. vla-addline
  4. entmake

Pour mesurer le temps passé, c'est la variable "millisecs" qui est interrogée deux fois, au lancement puis une fois que les lignes sont dessinées.
Il ne reste qu'à transformer en chaîne de caractères (string) la division par mille de la soustraction des deux valeurs pour afficher le temps passé dans une case (alert).


Tout d'abord il faut définir le nombre de répétitions (nombre de lignes à faire) et désactiver l'accrochage aux objets.

Vous en avez l'habitude maintenant :
je dépose des  images du code
pour vous habituer à taper vos commandes
et à la fin vous trouverez le texte en mode "copiable"


command avec messages

C'est la méthode basique qui se rapproche de ce qu'on fait "à la main" en ligne de commande :


command sans messages

La même avec quelques modifications de suppression des messages en ligne de commande :


Vla-Add-Line

Un peu plus évolué en utilisant les commandes VLISP :


Entmake

Et pour finir la fonction (entmake) qui présente l'avantage d'être de l'AutoLISP


Une fois le programme chargé il suffit de lancer la fonction définie par (defun) test1, test2, test3 puis test4 et de noter le temps passé pour désigner le plus efficace.


Quelle méthode est la plus rapide ?

Le but de ces comparaisons est d'appréhender que changer de méthode de création donne un résultat identique, mais plus ou moins rapidement.
Je ne divulgue pas de résultats en secondes, car ça dépend en grande partie de la machine sur laquelle on lance le programme, mais l'ordre des tests sera toujours du plus lent, test1 vers le plus rapide test4.


Et voici comme promis le code en texte :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
(setq repet 2000);nombre de répétitions
(setvar "osmode" 0);aucun accrochage objets
;=================================
(defun C:test1 (/ n time1 time2 )
   (setvar "cmdecho" 1)
   (setq n 0 time1 (getvar "millisecs")) 
   (while (< n repet)
      (command "._line" (list 0.0 n 0.0) (list 1.0 n 0.0) "")
      (setq n (1+ n))
   ) 
   (setq time2 (getvar "millisecs"))
   (alert (strcat (itoa repet) 
                  " Lignes dessinées en : " 
                  (rtos (/ (- time2 time1) 1000.0) 2 3)
                  " secondes")
) 
)
;=================================
(defun C:test2 (/ n time1 time2 )
   (setvar "cmdecho" 0)
   (setvar "nomutt" 1)
   (setq n 0 time1 (getvar "millisecs"))
   (while (< n repet)
      (command "._line" (list 0.0 n 0.0) (list 1.0 n 0.0) "")
      (setq n (1+ n))
   )
   (setq time2 (getvar "millisecs"))
   (alert (strcat (itoa repet)
                   " Lignes dessinées en : "
                   (rtos (/ (- time2 time1) 1000.0) 2 3)
                   " secondes")
)
(setvar "cmdecho" 1)
(setvar "nomutt" 0)
)
;=================================
(defun C:test3 (/ n time1 time2 ms )
   (vl-load-com)
   (setq n 0 time1 (getvar "millisecs"))
   (setq ms (vla-get-modelspace
               (vla-get-ActiveDocument 
                  (vlax-get-acad-object)))
   )
   (while (< n rept)
   (vla-addline ms
                (vlax-3d-point (list 0.0 n 0.0))
                (vlax-3d-point (list 1.0 n 0.0))
   ) 
   (setq n (1+ n))
   ) 
   (setq time2 (getvar "millisecs"))
   (alert (strcat (itoa repet)
                  " Lignes dessinées en : "
                  (rtos (/ (- time2 time1) 1000.0) 2 3)
                  " secondes")
   ) 
)
;=================================
(defun C:test4 (/ n time1 time2 )
   (setq n 0 time1 (getvar "millisecs")) 
   (while (< n repet)
      (entmake (list
               (cons 0 "LINE")
               (cons 10 (list 0.0 n 0.0))
               (cons 11 (list 1.0 n 0.0))
               )
      ) 
   (setq n (1+ n))
   )
   (setq time2 (getvar "millisecs"))
   (alert (strcat (itoa repet)
                  " Lignes dessinées en : "
                  (rtos (/ (- time2 time1) 1000.0) 2 3)
                 " secondes")
   ) 
)

À votre disposition par le formulaire CONTACT pour communiquer.

Haut de page

Retour vers Prog-Perso

le 03 mai 2019