Jump to content

How to speed up autoit program


 Share

Recommended Posts

Hello friends

This app is slow
How to increase its speed?

 

#include <Array.au3>
#include <StringConstants.au3>
#include <File.au3>
#include <String.au3>
Global $aWord[][2]  = [[1"google"],[2,"hello"]]



 
Global $sFileName = @ScriptDir & "\1.txt" ; 2MB Text File
Local $sFileRead = FileRead($sFileName)
Local $res = StringRegExp($sFileRead"(*UCP)\b[\pL\d]{2,}"3)
_ArrayDisplay($res)
 
for $sWord in $res
    $iIndex = _ArraySearch($aWord, $sWord000012)
    ;MsgBox(0,0,$iIndex)
    if $iIndex == -1 Then
        Local $aFill = [[0,$sWord]]
        _ArrayAdd($aWord,$aFill)
       
    Else
        $aWord[$iIndex][0] +=1
    EndIf
 
Next
_ArrayDisplay($aWord)

cpu.png

taskmgr.png

1.txt

Edited by Jangal
1.txt added
Link to comment
Share on other sites

  • Developers

Why are you posting all these images? AutoIt3 is single threaded so will only run on one core of the CPU so will max use 25%.
Post your script code (not image) in a CODEBLOCK (<>) so we can have a proper look/test with that to see what can be done to make that faster. 

Jos

SciTE4AutoIt3 Full installer Download page   - Beta files       Read before posting     How to post scriptsource   Forum etiquette  Forum Rules 
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Link to comment
Share on other sites

#include <Array.au3>
#include <StringConstants.au3>
#include <File.au3>
#include <String.au3>
Global $aWord[][2]  = [[1, "google"],[2,"hello"]]



 
Global $sFileName = @ScriptDir & "\1.txt" ; 2MB Text File
Local $sFileRead = FileRead($sFileName)
Local $res = StringRegExp($sFileRead, "(*UCP)\b[\pL\d]{2,}", 3)
_ArrayDisplay($res)
 
for $sWord in $res
    $iIndex = _ArraySearch($aWord, $sWord, 0, 0, 0, 0, 1, 2)
    ;MsgBox(0,0,$iIndex)
    if $iIndex == -1 Then
        Local $aFill = [[0,$sWord]]
        _ArrayAdd($aWord,$aFill)
       ; 
    Else
        $aWord[$iIndex][0] +=1
    EndIf
 
Next
_ArrayDisplay($aWord)

This script is fast on short strings
But in the attached file it takes hours

Link to comment
Share on other sites

  • Developers

Care to also explain what it is you want to accomplish with the script and what it is for, so we understand?

SciTE4AutoIt3 Full installer Download page   - Beta files       Read before posting     How to post scriptsource   Forum etiquette  Forum Rules 
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Link to comment
Share on other sites

So you're looking to make a script that creates a list of words and the number of times they appear in the document, right?

Right now, if a word appears 5 times in your document, you search for that word 5 times. Also, you begin your search at the beginning of the array each time, you only need to search after the current index word.

Possibly check out the implementation of _ArrayUnique in Array.au3 to get an idea of how to get started. (Note that this doesn't keep track of how many times each word appears)

Edited by seadoggie01

All my code provided is Public Domain... but it may not work. ;) Use it, change it, break it, whatever you want.

Spoiler

My Humble Contributions:
Personal Function Documentation - A personal HelpFile for your functions
Acro.au3 UDF - Automating Acrobat Pro
ToDo Finder - Find #ToDo: lines in your scripts
UI-SimpleWrappers UDF - Use UI Automation more Simply-er
KeePass UDF - Automate KeePass, a password manager
InputBoxes - Simple Input boxes for various variable types

Link to comment
Share on other sites

I'd say scripting dictionary.  It is the perfect situation to use it.  Here to start you up :

#include <Constants.au3>
#include <Array.au3>

Opt ("MustDeclareVars", 1)

Local $t = TimerInit()
Local $oDict = ObjCreate("Scripting.Dictionary")
Local $aWord = FileReadToArray("1.txt")
Local $iCount = @extended, $p

For $i = 0 To $iCount - 1
  If Not StringRegExp ($aWord[$i], "(*UCP)\b[\pL\d]{2,}") Then ContinueLoop
  $p = $aWord[$i]
  If $oDict.Exists($p) Then
    $oDict.Item($p) = $oDict.Item($p) + 1
  Else
    $oDict.Add($p, 1)
  EndIf
Next

ConsoleWrite($iCount & "/" & $oDict.Count & @CRLF)

Local $aCount[$oDict.Count][2]
$p = 0
For $vKeys In $oDict
  $aCount[$p][0] = $vKeys
  $aCount[$p][1] = $oDict.item($vKeys)
  $p += 1
Next

MsgBox($MB_SYSTEMMODAL, "", $p & "/" & TimerDiff($t))

Taking me 4.5 secs overall with your 1.txt file.

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...