Author Topic: make a program running immediatly at the first execution  (Read 632 times)

0 Members and 1 Guest are viewing this topic.

samideqlqpart

  • Newt
  • Posts: 34
make a program running immediatly at the first execution
« on: August 02, 2017, 05:15:57 pm »
hello
my problem is
when i lunch my plug-in in autocad for the first time, it takes a long time to execute
but after and at every time it takes a very short moment
it seems that something is stoked in the RAM.i don't know wich element
my question : what can i do to make my program running immediatly at the first call
 
thank you

Atook

  • Swamp Rat
  • Posts: 834
Re: make a program running immediatly at the first execution
« Reply #1 on: August 02, 2017, 05:32:24 pm »
Sounds to me like you're loading a large array or list when loading the DLL? Maybe from a database/text file?

You could start using a timer to troubleshoot where the problem is.

Something like:
Code - C#: [Select]
  1. Stopwatch timer = Stopwatch.StartNew();
  2. // do stuff
  3. timer.Stop();
  4. Debug.Writeline($"Elapsed time: {timer.ElapsedMilliseconds} ms.");
  5.  

Once you've figured out where the problem is, you can optimize it, and decide if you want it called in the Inititalize() event of the IExtensionApplication, or when your code is actually called by the user.
« Last Edit: August 02, 2017, 05:38:10 pm by Atook »

samideqlqpart

  • Newt
  • Posts: 34
Re: make a program running immediatly at the first execution
« Reply #2 on: August 02, 2017, 05:51:38 pm »
i've translated it to vb.net

Dim timer As Stopwatch = Stopwatch.StartNew()
' do stuff
timer.[Stop]()
Debug.Writeline("Elapsed time: {timer.ElapsedMilliseconds} ms.")

1-where do i have to past this code?
2-what the code do?

Atook

  • Swamp Rat
  • Posts: 834
Re: make a program running immediatly at the first execution
« Reply #3 on: August 02, 2017, 07:20:33 pm »
That code wraps around various elements of your code that are initializing things. The Debug.Print statement will tell you how how long it took. You will see it in the output window of Visual studio when you debug your code.

Code - C#: [Select]
  1. Stopwatch dbTimer= Stopwatch.StartNew();
  2. // do load database
  3. dbTimer.Stop();
  4. Debug.Writeline($"Loading Database, elapsed time: {dbTimer.ElapsedMilliseconds} ms.");
  5. ...
  6. Stopwatch layerTimer= Stopwatch.StartNew();
  7. // do Layer Creation
  8. layerTimer.Stop();
  9. Debug.Writeline($"Creating Layers, elapsed time: {layerTimer.ElapsedMilliseconds} ms.");


When this code gets called you might see something like this in the output window of your IDE while debugging:
Code: [Select]
Loading Database, elapsed time: 5042 ms.
Creating Layers, elapsed time: 15 ms.

That would tell you that the delay is loading the database, and you can decide how to change it, or where to put it.

I'm not familiar with the VB.NET IExtensionApplication.Initialize event is, but that's where you put code that runs when your app is loaded. If you were calling the loaddatabase in that function you'd see a pause when your app was first loaded into memory. If you were calling loaddatabase in some other command you created, you'd see the pause then.

samideqlqpart

  • Newt
  • Posts: 34
Re: make a program running immediatly at the first execution
« Reply #4 on: August 03, 2017, 07:08:00 am »
i see nothing :crazy2:
but i can't change anything cause my program is established
perhaps i reserved a large array dim... dim..... at the begin


but how to explain that in the second uses it's fast than the first run

MexicanCustard

  • Swamp Rat
  • Posts: 672
Re: make a program running immediatly at the first execution
« Reply #5 on: August 03, 2017, 08:12:41 am »
Autocad doesn't load your DLL into memory until you execute something in it. So the first time you run your command it loads the DLL and executes the command. The second time and every time there after the DLL is already loaded and Autocad just executes your command.  That's the time difference in the first and second execution.
AMEP 2017 64bit Win 10

nullptr

  • BricsCAD
  • Needs a day job
  • Posts: 6735
  • AKA Daniel
Re: make a program running immediatly at the first execution
« Reply #6 on: August 03, 2017, 09:46:04 am »
Not much you can do about time on the JITTER  :crazy2:
https://en.wikipedia.org/wiki/Just-in-time_compilation
see Startup delay and optimizations

samideqlqpart

  • Newt
  • Posts: 34
Re: make a program running immediatly at the first execution
« Reply #7 on: August 03, 2017, 04:56:28 pm »
ok
MexicanCustard you're in right!
i think that there is no solution.
is it possible to make a subroutine  between the moment of execution  and the tracing
to keep or to occupe the user like...
"wait for a moment!" or "the program compute!" or a mouse pointer in use or other

Jeff H

  • Needs a day job
  • Posts: 5841
Re: make a program running immediatly at the first execution
« Reply #8 on: August 03, 2017, 05:07:47 pm »
samideqlqpart,

There are so many different things it could be it is just wild guesses trying to figure out without having your add-in to test.
If you have no idea what order things are loaded and how when then get loaded then simplest thing would be commenting portion of code out until you find the bottleneck.

If you want to narrow it down for starters does your app use ExtensionApplication event?
Application Initialization

samideqlqpart

  • Newt
  • Posts: 34
Re: make a program running immediatly at the first execution
« Reply #9 on: August 03, 2017, 05:40:23 pm »
my app does'nt use ExtensionApplication event
i'm looking now at the link

nullptr

  • BricsCAD
  • Needs a day job
  • Posts: 6735
  • AKA Daniel
Re: make a program running immediatly at the first execution
« Reply #10 on: August 03, 2017, 08:35:57 pm »
ExtensionApplication is a good place to move JIT time to, for example,
if your routine is using a database, you can run a query or two to get the database JITTED up,
or load your winforms (without calling show).. this will at least move the annoying wait to startup

samideqlqpart

  • Newt
  • Posts: 34
Re: make a program running immediatly at the first execution
« Reply #11 on: August 04, 2017, 07:39:28 am »
hello
i've used Initialization of code and Optimizing the loading of my pluggin
i got the same result
i realise that i have to build something to keep the user's attention when  loading the database
from i get point insertion of my drawing until it's created like... "wait for a moment!" ....but how to do it.?.

samideqlqpart

  • Newt
  • Posts: 34
Re: make a program running immediatly at the first execution
« Reply #12 on: August 04, 2017, 09:20:42 am »
ie
and make the message disapear when the drawing is done

n.yuan

  • Bull Frog
  • Posts: 234
Re: make a program running immediatly at the first execution
« Reply #13 on: August 04, 2017, 09:28:35 am »

samideqlqpart

  • Newt
  • Posts: 34
Re: make a program running immediatly at the first execution
« Reply #14 on: August 04, 2017, 10:17:10 am »
hello and thank you Mr Yuan
"This process may take a while to complete. It is a common practice to show a progress bar during this lengthy processing to let user know that AutoCAD is busy processing data."
Yeeeeaaaaaahhh for the link