• Offizieller Beitrag

    Hmm...ich kann mich noch dukel an den Thread damals erinnern und damals war die Callback-Variante am schnellsten.

    Inzwischen muss man wohl sagen, dass StringRegExpReplace schneller ist.

    Ich habe mal das Script von Bitnugger etwas geändert:

    Spoiler anzeigen

    auf den Thesaurus als Textform von hier: https://www.openthesaurus.de/export/OpenThe…Textversion.zip

    losgelassen und das Ergebnis sieht so aus:

    Code
    Laenge der  Textdatei = 2675226 Bytes
    
    _StringRegExpReplace_Simple    Substitutions = 36375  Time: 163.841491 ms
    _StringRegExpReplace_Callback  Substitutions = 36375  Time: 466.781470 ms

    Und auch wenn man die Stringlänge auf das Zehnfache erhöht (For...Next-Schleife) verhalten sich beide Funktionen zeitlich linear.

  • Hmm...ich kann mich noch dukel an den Thread damals erinnern und damals war die Callback-Variante am schnellsten.

    Inzwischen muss man wohl sagen, dass StringRegExpReplace schneller ist.

    Tja, da hat sich wohl Einiges getan, ich bin auch etwas überrascht ^^!

    Fazit : Replace_Simple ist ca. 2,75 mal schneller als Replace_Callback

    Verwendet man in _StringRegExpReplace_Simple(ByRef $sString) :

    $sString = StringReplace($sString, $aReplace[$i][0], $aReplace[$i][1])

    statt :

    $sString = StringRegExpReplace($sString, $aReplace[$i][0], $aReplace[$i][1])

    dann ist StringRegExpReplace knapp 10 x schneller als StringReplace.

    Edit : Ich habe meinen Beitrag #17 mal an die neue Lage angepasst.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    2 Mal editiert, zuletzt von Musashi (8. September 2019 um 16:35)

    • Offizieller Beitrag

    Das ist das Gute am Forum - letztlich wird eine Lösung nahe am Optimum gefunden.

    Sehe ich auch so!

    Es schadet ja nicht, wenn man die bisherigen Ergebnisse mal neu hinterfragt.

    Am meisten wunderte ich mich aber über die Tatsache, dass StringRegExpReplace schneller als StringReplace ist.

    Aus den "alten" Testergebnissen hatte ich immer in Erinnerung, dass die einfachen Stringfunktionen schneller als RegExp waren.

    Dass sich das jetzt umgedreht hat, überraschte mich doch sehr.

  • Hallo Bitnugger !

    Ich weiß zwar nicht, ob es für Dich von Bedeutung ist, trotzdem möchte ich von meiner Seite mal ein Dankeschön aussprechen. Durch deine Beharrlichkeit wurde die bisherige Lehrmeinung;) revidiert, und auf den neuesten Stand gebracht:thumbup:.

    Das Ergebnis hat, wie man sieht, nicht nur mich überrascht.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Mich wundert vor allem, dass keiner ein Wort zu dieser Zeile in der Funktion _StringRegExpReplace_Simple gesagt hat:

    StringReplace($sString, Chr(26), "'", 0, 2)

    Die hatte ich eingebaut, weil der von mir verknüpfte Textstring nach der Ersetzungsaktion nicht mehr identisch war, was ich mir so aus dem Stehgreif aber auch nicht erklären konnte.

    If $sReplace1 <> $sReplace2 Then

    Heute bin ich der Sache auf den Grund gegangen und habe festgestellt, dass in einer der verknüpften Textdateien tatsächlich an allen Stellen, wo eigentlich ein "'" stehen sollte, ein "SUB" (Chr26)) stand. In dem Fall kann _StringRegExpReplace_Callback natürlich nicht wie erwartet funktionieren!

    Da obige Zeile somit unnötig ist, sieht das Ergebnis dann so aus:

    Code
    Name der Textdatei  = m:\OpenThesaurus-Textversion\openthesaurus.txt
    Länge der Textdatei = 2711842 Bytes
    
    _StringRegExpReplace_Simple    Substitutions = 36375  Time:  98.193910 ms
    _StringRegExpReplace_Callback  Substitutions = 36375  Time: 910.024653 ms
  • Hallo Bitnugger !

    Mich wundert vor allem, dass keiner ein Wort zu dieser Zeile in der Funktion _StringRegExpReplace_Simple gesagt hat:

    StringReplace($sString, Chr(26), "'", 0, 2)

    Wahrscheinlich waren alle, ob des Ergebnisses, noch etwas geschockt ^^.

    Daher bin ich, zumindest normalerweise, kein Fan von 'magic numbers'.

    Die Zeile :

    $sString = StringReplace($sString, Chr(26), "'", 0, 2)

    wäre möglicherweise eher aufgefallen, wenn man sie wie folgt geschrieben hätte :

    $sString = StringReplace($sString, Chr(26), "'", 0, $STR_NOCASESENSEBASIC)

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Der Beitrag hat es Euch aber angetan.

    Könnte mal jemand das finale Code Ergebniss zu meiner ursprünglichen Filter Anfrage hinzufügen. So dass man das als weniger "fitter" Autoiter auch versteht?

    Danke für Eure Mühe

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Hallo Peter S. Taler !

    Die einfache Variante wäre nun :

    Allgemeingültiger wäre es natürlich, wenn man das Ersetzen in eine Funktion auslagern würde.

    Dazu kannst Du Dir die Beispiele von Bitnugger oder Oscar anschauen.

    Zur Zeit ist das Ersetzungsarray (aus Testgründen) noch Teil der Funktion _Replace_Simple. Generell ist es sinnvoller, nicht nur den String, sondern auch das Array an die Funktion zu übergeben, dann wird die Sache flexibler.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (6. November 2017 um 09:04) aus folgendem Grund: Erweiterung