TheAutomator Posted December 18, 2019 Posted December 18, 2019 Hi everyone! I'm using AutoIt for several years now and I really get the hang of it! I'm quite the curious OCD perfectionist kind of guy, so I can't help wondering.. what would be the best way to program stuff for the compiler / interpreter / scripting engine? We're talking about the inner workings of the AutoIt's core here, and how to give it as less friction as possible but also take care of the machine running the script. For example, Imagine a script where we would constantly have to assign a Boolean value to a variable: ; A: local $bool = false $bool = true $bool = true $bool = false ; B: local $bool = false check(true) check(true) check(false) func check($b) if $bool = $b then return $bool = $b endfunc In this case, would it be better to just overwrite (A) the variable or first check if we really need to (B)? What would be best for the computers memory if it had to do this for a year non stop? Another example, imagine you're writing a function with an if statement. If you would look under the hood of AutoIt, what would be the best way to give your computer as less work / code nesting stack filling as possible: ; A: func decide($b_Input) if $b_Input then ;do something else ;do something else endif endfunc ; B: func decide($b_Input) if $b_Input then ;do something return endif ;do something else endfunc Last one for now: ; A: while 1 ; do stuff wend ; B: while true ; do stuff wend Isn't AutoIt taking an extra step in converting 1 to a Boolean in example (A)? Or is it the other way around and does the (B) way make AutoIt first convert a keyword (true or false) to a numerical value (0 or 1). I think this kinda detail stuff is quite interesting, makes me wonder how AutoIt converts and runs our code. What are your opinions on this topic? Any coders who know more about the inner workings of AutoIt? Any people like me who ask themselves similar questions (with examples)? Let me know! 😉 Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
RTFC Posted December 18, 2019 Posted December 18, 2019 (edited) Example 1: better to just overwrite (A) the variable (same memory location, so the number of (re)writes doesn't matter). But every extra function call costs performance. Example 2: Fastest evaluation uses Switch, not If/Then/Else, e.g., Switch $b_Input Case True ; do something Case Else ; do something else EndSwitch Example 3: AFAIK, boolean "True" is converted to 1, so "While 1" is marginally faster than "While True". Edited December 18, 2019 by RTFC clarification FrancescoDiMuro, argumentum, Xandy and 1 other 3 1 My Contributions and Wrappers Spoiler BitMaskSudokuSolver BuildPartitionTable CodeCrypter CodeScanner DigitalDisplay Eigen4AutoIt FAT Suite HighMem MetaCodeFileLibrary OSgrid Pool RdRand SecondDesktop SimulatedAnnealing Xbase I/O
TheAutomator Posted December 19, 2019 Author Posted December 19, 2019 RTFC, Nice reply's! I'm curious, how do you know AutoIt works that way with example 2 and 3? Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
TheAutomator Posted December 19, 2019 Author Posted December 19, 2019 Another interesting one would be, do we include every constant needed manually instead of just using them all with #include ? Or does AutoIt delete non used variables and functions while compiling to an exe file? I have a hundred of these questions actually, not sure where to put them at this point 😅 Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
Moderators Melba23 Posted December 20, 2019 Moderators Posted December 20, 2019 TheAutomator, Quote does AutoIt delete non used variables and functions while compiling to an exe file? No, but using the Au3Stripper utility (which is in the full SciTE4AutoIt3 package) does exactly that if you give it the correct parameters. Quote I have a hundred of these questions actually, not sure where to put them at this point Keep asking them in this thread. M23 Xandy 1 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
RTFC Posted December 20, 2019 Posted December 20, 2019 (edited) 14 hours ago, TheAutomator said: how do you know AutoIt works that way Because under the hood, AutoIt is coded in C++ (link). M23 beat me to the punch on Au3Stripper. Quoting Jos: "Au3Stripper can produce a single sourcefile that is similar to what is stored in the compiled script file. " EDIT: this is also why script line numbers usually don't match up with the exe's reported error line numbers. Edited December 20, 2019 by RTFC My Contributions and Wrappers Spoiler BitMaskSudokuSolver BuildPartitionTable CodeCrypter CodeScanner DigitalDisplay Eigen4AutoIt FAT Suite HighMem MetaCodeFileLibrary OSgrid Pool RdRand SecondDesktop SimulatedAnnealing Xbase I/O
TheAutomator Posted December 20, 2019 Author Posted December 20, 2019 Thanks RTFC, Melba23! So AutoIt is closed source since autoit-v3.1.0, to bad I can't literally look at the source for that matter.. Okay! i'll keep the questions rolling 😀 What about this one: ;A: while 1 for $item = 0 to ubound($array) - 1 ;do stuff next wend ;B: $ubound = ubound($array) - 1 while 1 for $item = 0 to $ubound ;do stuff next wend do we each time calculate ubound() - 1 and save memory or take up more space like in example (B) but spare our computer on doing those ubound() call and -1 calculations? Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
TheAutomator Posted December 20, 2019 Author Posted December 20, 2019 (edited) Another one: Does it matter if we have one big loop full of switches with code that decide what happens (A)? Or do we make a switch that calls functions doing that stuff (B)? (imagine huge blocks of code) Example A while 1 switch guigetmsg() case $gui_event_close exit case $a guictrlsetstate($x, $gui_disable) local $y = guictrlread($z) guictrlsetdata($user, '') ... case $b guictrlsetstate($x, $gui_enable) local $y = guictrlread($z) ... case $c guictrlsetdata($aze, '123456789') ... ... ... ... endswitch wend Example B while 1 switch guigetmsg() case $a do_stuff_for_A() case $a do_stuff_for_B() case $a do_stuff_for_C() ... ... ... endswitch wend Edited December 20, 2019 by TheAutomator Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
water Posted December 20, 2019 Posted December 20, 2019 You could use functions TimerInit and TimerDiff to check which one is faster: ;A: Global $hTimer $hTimer = TimerInit() while 1 for $item = 0 to ubound($array) - 1 ;do stuff next wend ConsoleWrite("A: " & TimerDiff($hTimer) & @CRLF) ;B: $hTimer = TimerInit() $ubound = ubound($array) - 1 while 1 for $item = 0 to $ubound ;do stuff next wend ConsoleWrite("B: " & TimerDiff($hTimer) & @CRLF) SkysLastChance 1 My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
water Posted December 20, 2019 Posted December 20, 2019 BTW: Your While loop needs to check for an exit condition, else it will run forever My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
TheAutomator Posted December 20, 2019 Author Posted December 20, 2019 (edited) Water, 30 minutes ago, water said: You could use functions TimerInit and TimerDiff to check which one is faster: not looking for the fastest way here, but for the way that gives the computer as less work as possible. e.g. checking and evaluating / allocating and overwriting memory (low level behind the scenes stuff). Imagine you would be a computer and had to do all that stuff manually yourself, what would give you the most work / wear? Do you know what i mean? 😉 28 minutes ago, water said: BTW: Your While loop needs to check for an exit condition, else it will run forever I know i know, it's just to give you an example.. The ;do stuff part would be replaced with that kinda stuff if it wasn't an example 🙂 Edited December 20, 2019 by TheAutomator Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
water Posted December 20, 2019 Posted December 20, 2019 16 minutes ago, TheAutomator said: but for the way that gives the computer as less work as possible. More work to do means more CPU cycles means longer run time. So i think measuring the time it takes to do the work is a good indicator for efficiency. 18 minutes ago, TheAutomator said: just to give you an example It is good practice on this forum to post runable examples so people don't have to spend much time to play with your code Xandy 1 My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
TheAutomator Posted December 20, 2019 Author Posted December 20, 2019 (edited) Water, About the TimerDiff example , wasn't sure if it gave reliable results for all types of actions like declaring variables etc.. And sure, but I just don't want to write miles of code to give an obvious little example or have to think out and write a bunch of code making the example more unreadable. I get what you mean tho, so for more advanced stuff i will write working code examples 🙂 Edited December 20, 2019 by TheAutomator Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
TheAutomator Posted December 20, 2019 Author Posted December 20, 2019 (edited) For this one i'm not sure if there are any better solutions: You have a huge array, filled with lots of data and you need to delete one of the items in the middle. The array fills up almost all of your computer memory, what would be the best way to resize it? Should I search the index number of the item to delete and then in a loop copy the next item over the current one and redim to cut the last one of? You always copy one of the elements that way doubling it's memory usage temporary.. Is this the only way? Edited December 20, 2019 by TheAutomator Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
water Posted December 20, 2019 Posted December 20, 2019 In this case I suggest to use a database. Because sooner or later you will hit one of the AutoIt limits with such a huge array. TheAutomator 1 My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
jchd Posted December 20, 2019 Posted December 20, 2019 BTW AutoIt arrays are limited to only 16 millions cells, while databases are essentially unbounded in size (I've [remotely] approached an SQLite DB totalling 120Tb) and they offer unrivaled possibilities for searching, sorting, massaging data in any volume and complexity. TheAutomator and Danyfirex 2 This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe hereRegExp tutorial: enough to get startedPCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta. SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)
RTFC Posted December 21, 2019 Posted December 21, 2019 (edited) 17 hours ago, TheAutomator said: do we each time calculate ubound() - 1 and save memory or take up more space like in example (B) but spare our computer on doing those ubound() call and -1 calculations This is bascially the same question as you posed before, with the same answer: every function call requires a stack frame push, a jump to the function code, function execution (possibly with local var read/writes), storage of result(s) (either on the stack or in a global var), and return from the call with stack pop. So whenever a function in a loop would always provide the same return, you should move it out of the loop, as just reading a value from memory is much, much faster. RE. the huge-array question, I wouldn't resize each time you delete one entry, just reserve some special value/content to mark a cell as deleted, and clean-up periodicially or after some threshold is reached. Also, you don't have to store content contiguously. But if you're really into large-scale, low-level memory management, then AutoIt wouldn't necessarily be the most appropriate work environment. If you're interested, you can have a look at how my HighMem environment (in AutoIt) manages large memory allocations. And for high performance, using ReDim repeatedly is a terrible idea. Edited December 21, 2019 by RTFC My Contributions and Wrappers Spoiler BitMaskSudokuSolver BuildPartitionTable CodeCrypter CodeScanner DigitalDisplay Eigen4AutoIt FAT Suite HighMem MetaCodeFileLibrary OSgrid Pool RdRand SecondDesktop SimulatedAnnealing Xbase I/O
TheAutomator Posted December 22, 2019 Author Posted December 22, 2019 RTFC, I see, thanks for explaining, conclusion: store function returns or math inside loops to variables instead if possible WATER and JCHD, Never worked with a database yet, have to look into that for sure! Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
TheAutomator Posted December 23, 2019 Author Posted December 23, 2019 It seems like $boolValue = False would also be better then NOT($boolValue) i guess. NOT converts the result to the opposite boolean first so i suppose it's in the language only for simplicity right? Retro Console, NestedArrayDisplay UDF foldermaker-pro-clone MiniMark Editor
Musashi Posted December 23, 2019 Posted December 23, 2019 2 hours ago, TheAutomator said: It seems like $boolValue = False would also be better then NOT($boolValue) i guess. I' am not sure if this is a robust test ? Global $hTimer, $bBoolean, $iMax = 5000000 $hTimer = TimerInit() For $i = 1 To $iMax $bBoolean = False Next ConsoleWrite("1. Time = " & TimerDiff($hTimer) & @CRLF) $hTimer = TimerInit() For $i = 1 To $iMax $bBoolean = Not(True) Next ConsoleWrite("2. Time = " & TimerDiff($hTimer) & @CRLF) Variation 2 takes twice as long. SkysLastChance and TheAutomator 2 "In the beginning the Universe was created. This has made a lot of people very angry and been widely regarded as a bad move."
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now