In an earlier post I showed a routine for gathering attributes from a block insertion object. I have since found a better way to get the attribute objects.
For years I have been using vla-get-attributes, which returns a variant, which must then be converted to a safearray and then a list. The “New and Improved” method is to use vlax-invoke.
Below are a couple of test procedures I used to benchmark these two methods.
First, I selected the block insertion and converted the entity name to a vla object.
(setq obj (vlax-ename->vla-object(car (entsel))))
Here are the two functions. AttTest1 using vla-getattributes, and AttTest2 using vlax-invoke. Note that the functions are defined using Defun-q rather than Defun. This is because the benchmarking routine I used (by Vladimir Nesterovsky – Profiler) requires defun-q. I typically change the defun to defun-q to run the profiler, then change it back.
(defun-q attTest1
()
(vlax-safearray->list
(vlax-variant-value
(vla-getattributes obj)
)
)
(princ)
)
(defun-q attTest2
()
(vlax-invoke obj 'getattributes)
(princ)
)
Now for the fun part. Profile-Func is a routine in Vladimir’s profiler that registers the function and starts the timer.
(profile-func 'attTest1)
(profile-func 'attTest2)
Below are the timer results after running both routines 10 times.
Routine | Number of runs timed | Total seconds for all runs | Average seconds per run |
AttTest1 | 10 | 0.4 | 0.041 |
AttTest2 | 10 | 0.07 | 0.007 |
To put this in perspective, the test block I created for this has 10,000 attributes. That’s 0.00007 milliseconds per attribute! Not too shabby! Needless to say, I am going to be using vlax-invoke to get block attributes on all my routines in the future. In addition I am going to be looking much more closely at the vlax functions. I am particularly interested in using vlax-invoke with the GetDynamicBlockProperties method.