Loop beschleunigen

  • C#

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Loop beschleunigen

    Abend,

    ich suche derzeit eine Möglichkeit, einen Loop zu beschleunigen.
    Ich loope durch etwa 5000 Wörter, matche jedes mal mit RegEx einen Text mit diesem Wort und gehe dann jedes Match
    noch einmal durch, um es zu behandeln. Das ganze endet natürlich in einem riesigen Haufen langsamem Mülls.
    Diese ganze Methode wird in einem TextChanged-Event aufgerufen, daher ist das ziemlicher Mist - die Eingabe verzögert sich bei For Each um 3-5,
    bei For sogar um 5-10 Sekunden.

    Gibt es eine Möglichkeit, das ganze zu beschleunigen?
    Ich habe bereits an einen eigenständigen Thread gedacht, aber das ändert ja rein technisch auch nichts, oder doch?

    Grüße

    Edit by ~blaze~:
    *Thema aus Hauptforum verschoben*
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „FlashTek“ ()

    Quellcode

    1. string text = IO.File.ReadAllText("file");
    2. foreach (string pass_loopVariable in KeyDictionary.Keys)
    3. {
    4. //Check for Keywords in Text
    5. string pass = pass_loopVariable;
    6. MatchCollection KeyWordMatches = Regex.Matches(text, " <key>$".Replace("<key>", pass_loopVariable), RegexOptions.Multiline);
    7. //Loop through Matches
    8. foreach (Match KeyWordLoopMatch in KeyWordMatches)
    9. {
    10. Match SingleMatch = KeyWordLoopMatch;
    11. //Handle Match
    12. }
    13. }


    Ist C#, zu faul das zu konvertieren. Sorry :b
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

    Nikx schrieb:

    Ist C#, zu faul das zu konvertieren. Sorry :b
    Warum sorry, das ist gut. :thumbsup:

    Also zunächst mal kannst du Regex aus der Schleife rausholen und vielleicht sogar vorkompillieren. Leg dir einfach dann ein Dictionary an, das jedem Key den fertig kompillierten Regex-Ausdruck zuordnet, so solltest du einiges an Performance rausholen können.
    @ThuCommix: Die Datei lese ich vorher ein, habe das nur oben dran gehauen damit ich den ZwischenCode weglassen kann. Wie kann ich denn nur die aktuelle Zeile ansprechen?

    @Artenus: Wie ist das hier gemeint? Wozu soll denn in dem RegEx-Fall ein Dictionary dienen?

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Dadurch, dass du die statische RegEx.Matches-Funktion verwendest, wir in jedem schleifendurchlauf das Pattern neu geparst. Du kannst die RegEx-Klasse aber auch instanzieren, wodurch das dann nur einmal passiert. Wenn du bei der Instanzierung noch Compiled angibst, wird der Ausdruck kompilliert, was nochmal Geschwindigkeit gibt.
    Hawr, schon wieder das Artenus-Artentus-Problem :D

    Wenn ich das ganze instanziere muss ich aber ja das Pattern schon angeben. Das möchte ich am Ende aber dynamisch halten.
    Da man das Pattern im Nachhinein nicht ändern kann habe ich nur noch RegExOptions.Compiled hinzugefügt, und den Rest nicht verändert. Hilft
    das so auch?

    Dann noch generell: Weitere Ideen? Ich vermute dass das nicht reichen wird.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    @Artentus: Ich glaube ich verstehe da etwas falsch. Was soll ich wo hinterlegen?

    @vb-checker: Viel Spaß dabei mir zu zeigen, wie ich mit den String-Methoden dynamisches matchen verschiedener Text-Syntaxen bewerkstelligen soll.
    Ich bezweifle, dass es da überhaupt eine Möglichkeit gibt.
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Naja, du hast ja irgendwo deine Liste mit den Keys. Da legst du zusätzlich noch ein Dirctionary<string, RegEx> an, welches jedem dieser Keys einen RegEx-Ausdruck zuordnet. Immer, wenn sich die Liste der Keys ändert, passt du dieses Dictionary entsprechend an, also kommt ein Key dazu, erstellst du dazu eine neue RegEx-Instanz und trägst sie im Dictionary ein, wird ein Key entfernt, entfernst du den Eintrag aus dem Dictionary. In der Schleife kannst du dir zu jedem Key dann den zugehörigen RegEx-Ausdruck ganz einfach über das Dictionary holen.
    Moin,

    vielleicht bringt Dir Parallel-ForEach einen Vorteil. Ist aber nur zu empfehlen, wenn die die Ergebnisse unabhängig voneinander sind.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    mir scheint, du könntest einen allgemeinen Pattern wählen, der alle infragekommenden Worte matcht.
    Und dann die matches weiter aussieben und aufdröseln.
    Auf die Weise hast du nur einen Durchgang durch den Gesamt-Text.
    "Regex ist langsam" kann man so allgemein nicht sagen. Es ist sehr unterschiedlich schnell, je nachdem, wie der Pattern definiert ist. Da kannman dran rum-optimieren, aber ich denke hier sollte man vorrangig gucken, dass der Text nicht zig mal durchgenudelt werden muß.
    @ErfinderDesRades:

    Hier ist zu sagen, dass aus dem Text etwa 5000 verschiedene Wörter, jedoch NUR diese Wörter gematched werden müssen.
    Ich kann natürlich einen String nehmen, der alle 5000 Wörter aneinanderhängt und mit | trennt, aber ob das dann schneller wäre...?

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    nein, das wäre kaum schneller.
    Aber an Regex.Matches(text, " <key>$".Replace("<key>", pass_loopVariable), RegexOptions.Multiline); sehe ich doch, dass alle diese Worte mit $ enden, oder sehe ich das falsch?
    Und dafür kannman eine sehr schnelle Lösung finden, insbesondere mit dieser Überladung:

    ObjectBrowser schrieb:

    Public Function Replace(input As String, evaluator As System.Text.RegularExpressions.MatchEvaluator) As String
    Zum Vorkompilieren habich iwo gelesen, dass aufgrund eines Bugs dabei "Assemblies" entstehen, die ühaupt nicht mehr entladen werden, also damit soll man seinen Speicher ruckzuck aufgebraucht haben.