Modify

Opened 8 months ago

Last modified 8 months ago

#3794 assigned Feature Request

StringRegExp - string passed by value instead by reference?

Reported by: AspirinJunkie Owned by: Jpm
Milestone: Component: AutoIt
Version: Severity: None
Keywords: StringRegExp Cc:

Description

Script:

; create a very large string (should be about 400 MB because UTF-16 is used)
Global $sString = ""
For $i = 1 To 20 * 1024 * 1024
    $sString &= "xxxxxxxxxx"
Next

; precompile pattern
StringRegExp("", "^.")

; determine time required for a small input string:
$iT = TimerInit()
StringRegExp("Test", "^.")
ConsoleWrite(StringFormat("RegEx with small input string: % 8.3f ms\n", TimerDiff($iT)))

; determine time required for a large input string:
$iT = TimerInit()
StringRegExp($sString, "^.")
ConsoleWrite(StringFormat("RegEx with large input string: % 6.1f   ms\n", TimerDiff($iT)))

Output:

RegEx with small input string:    0.012 ms
RegEx with large input string:  328.1   ms

The execution time depends directly on the size of the input string although only the first character of the string is processed.
If instead of StringRegExp a StringLeft or a StringMid is used then the execution times are independent of this.

This leads to the assumption that in the implementation of StringRegExp() at some point the input string is passed as "by value".
This would require the creation of a local copy of the string and would explain the loss of time.

If it is really a "by value" problem, i suggest to switch completely to "by reference" internally if possible. This would mean a massive performance gain for StringRegExp especially with large strings.

Attachments (0)

Change History (4)

comment:1 Changed 8 months ago by TicketCleanup

  • Version 3.3.15.3 deleted

Automatic ticket cleanup.

comment:2 follow-up: Changed 8 months ago by Jpm

  • Owner set to Jpm
  • Status changed from new to assigned

Fix sent to Jon.
Many thanks

comment:3 in reply to: ↑ 2 Changed 8 months ago by anonymous

Replying to Jpm:
Oh really cool. That would solve a lot of problems for me.
For completeness and out of interest: Was it really a "by value" problem?

comment:4 Changed 8 months ago by anonymous

ByValue create new local value (internally for function) for the same data passed to the function, so there must be allocated and copied memory related to the data set.
ByReference mean that function do not create new data set for the data passed to the function, but only use reference (like a link) to the data set in memory.

btw.
Next time please ask on the forum.

EDIT:
This was mine comment
mLipok

Last edited 8 months ago by mLipok (previous) (diff)

Guidelines for posting comments:

  • You cannot re-open a ticket but you may still leave a comment if you have additional information to add.
  • In-depth discussions should take place on the forum.

For more information see the full version of the ticket guidelines here.

Add Comment

Modify Ticket

Action
as assigned The owner will remain Jpm.
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.