Hallo zusammen,
neulich gab es eine interessante Diskussion in der Shoutbox, die ich an dieser Stelle noch einmal aufgreifen wollte.
Es ging um die "Suchgeschwindigkeit" diverser AutoIt-eigener Funktionen.
Dazu hatte AspirinJunkie ein kleines Testscript gepostet, welches StringRegExp() (und auch Replace) als wesentlich schneller als die "nativen" Funktionen StringReplace() und auch Stringinstr() auswiesen.
Spoiler anzeigen
Global $s_String = BinaryToString(InetRead("https://autoit.de/"), 4)
ConsoleWrite(StringLen($s_String) & @CRLF)
For $i = 1 To 10
$s_String &= $s_String
Next
ConsoleWrite(StringLen($s_String) & @CRLF)
Global Const $N = 5
Global $x, $s_Search = "AutoIt"
$iT = TimerInit()
For $i = 1 To $N
StringReplace($s_String, $s_Search, $s_Search, 0, 1)
$x = @extended
Next
$iT = TimerDiff($iT)
ConsoleWrite(StringFormat("% 25s: %6.3f ms\tn = %3d\n", "StringReplace CS", $iT / $N, $x))
$iT = TimerInit()
For $i = 1 To $N
StringReplace($s_String, $s_Search, $s_Search)
$x = @extended
Next
$iT = TimerDiff($iT)
ConsoleWrite(StringFormat("% 25s: %6.3f ms\tn = %3d\n", "StringReplace CI", $iT / $N, $x))
$iT = TimerInit()
For $i = 1 To $N
$x = UBound(StringRegExp($s_String, $s_Search, 3))
Next
$iT = TimerDiff($iT)
ConsoleWrite(StringFormat("% 25s: %6.3f ms\tn = %3d\n", "StringRegExp CS", $iT / $N, $x))
$iT = TimerInit()
For $i = 1 To $N
$x = UBound(StringRegExp($s_String, "(?i)" & $s_Search, 3))
Next
$iT = TimerDiff($iT)
ConsoleWrite(StringFormat("% 25s: %6.3f ms\tn = %3d\n", "StringRegExp CI", $iT / $N, $x))
$iT = TimerInit()
For $i = 1 To $N
StringRegExpReplace($s_String, $s_Search, "")
$x = @extended
Next
$iT = TimerDiff($iT)
ConsoleWrite(StringFormat("% 25s: %6.3f ms\tn = %3d\n", "StringRegExpReplace CS", $iT / $N, $x))
$iT = TimerInit()
For $i = 1 To $N
StringRegExpReplace($s_String, "(?i)" & $s_Search, "")
$x = @extended
Next
$iT = TimerDiff($iT)
ConsoleWrite(StringFormat("% 25s: %6.3f ms\tn = %3d\n", "StringRegExpReplace CI", $iT / $N, $x))
Alles anzeigen
Allerdings sieht das mit den "alten" AutoItversionen wiederum völlig anders aus!
String nach zeichen durchsuchen
vgl heute:
Spoiler anzeigen
Stringlänge Boyer-Moore StringInstr FindBytes StringRegExp Stringreplace
251 0.30482085 0.13116089 0.34292346 0.11504056 0.08866183
651 0.19271126 0.32900135 0.25645985 0.03590438 0.19857320
1451 0.20736611 0.77011231 0.25865808 0.03810260 0.42352513
3051 0.25352888 1.56220690 0.27404567 0.04543003 0.88808384
6251 0.38542252 3.23212694 0.36050928 0.07913618 1.89413923
12651 0.52244536 7.01893992 0.42352513 0.09232554 3.69375468
25451 0.80674943 14.1587823 0.54882409 0.15387591 7.27320155
51051 1.72634121 27.4573250 1.57832723 0.40593931 14.4079147
102251 3.01816615 52.7515944 2.20482203 0.75692295 26.8843204
204651 6.23710373 104.664931 3.77362361 1.41785664 56.6241382
409451 12.1144309 209.560676 7.86232648 3.64685917 112.311098
819051 28.6062652 420.421238 16.4339476 6.82256495 212.509232
1638251 49.6660159 763.889865 32.9375058 13.6707758 443.497496
3276651 112.843802 1538.02054 56.9655962 25.3279755 880.808449
6553451 170.384601 2596.69855 126.769573 53.3216680 1553.45575
13107051 222.120615 3161.95439 151.180887 71.3771747 2020.19731
26214251 884.983615 12665.1572 490.066210 206.091141 6898.92404
Alles anzeigen
Ich will ja niemandem auf den Schlips treten, aber wenn eine Funktion in egal welcher Bibliothek hochoptimiert ist, dann die Suchfunktion von Strings in Strings!
Dass PCRE hochoptimiert und im Lauf der Jahre ggf. sogar multithreaded doppelt bis dreimal so schnell wird, akzeptiere ich, aber dass eine 6 Jahre alte SUCHFUNKTION aus einer Bibliothek Faktor 3-4 SCHNELLER sein soll als eine aktuelle Funktion, kann mir wirklich keiner mehr erzählen....
Für mich sieht das so aus, als ob, nachdem in einigen Threads im EN-Forum das "elitäre" RegEx mit "simplen" Stringfunktionen geschwindigkeitsmäßig an die Wand gespielt wurde, dieses "Sakrileg" in den neueren AutoIt-Versionen einfach "korrigiert" wurde.
Wer möchte, kann die Funktionen gerne unter 3.3.6 oder 3.3.8 testen und sich bei den Stringfunktionen gegenüber der aktuellen Version 3.3.12. um Faktor 3-4 an Geschwindigkeitszuwachs wundern.
Da wird AutoIt-Usern im Jahre 2015 ein Golf II als "neu" verkauft und alles freut sich!