Performance einer Function verbessern

  • VB.NET
  • .NET 5–6

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Humax.

    Performance einer Function verbessern

    Hallo, habe eine Funktion die ca 6000 mal aufgerufen wird, das dauert dann 30 Sekunden. Bekomme ich das schneller hin?
    GameLanguage ist ein String.


    VB.NET-Quellcode

    1. Private Function Übersetzen(ByVal Wert As String) As String
    2. Dim str_Übersetzung As String = String.Empty
    3. If GameLanguage.Contains(Wert & ": " & Chr(34)) Then
    4. str_Übersetzung = GameLanguage.Substring(GameLanguage.IndexOf(Wert & ": " & Chr(34)) + Wert.Length + 3)
    5. str_Übersetzung = str_Übersetzung.Substring(0, str_Übersetzung.IndexOf(Chr(34)))
    6. Return str_Übersetzung
    7. Else
    8. Return Wert
    9. End If
    10. End Function


    CodeTags korrigiert; bitte zukünftig darauf achten, das richtige CodeHighlighting zu verwenden ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Du willst aus "Irgendwas: ""blablabla""" "blablabla" rausholen?

    Vielleicht gehts mit Regex schneller, ist zumindest weniger anstrengend zu coden.

    petaod schrieb:

    Kannst du nicht an der Stelle optimieren?
    Wenn du 6000 Wert- Werte hast kannst du alle zu einem String zusammenfügen, diesen String übergeben und der richtige Regex spuckt dir dann 6000 Matches aus deiner benötigten Group aus. Das wird sicherlich schneller gehen.
    Je nach dem wie die Werte vor der Funktion vorliegen...Sind die vielleicht schon in einem Array?
    Ah habs falsch verstanden, dein GameLanguage ist ja schon der String, den man mit Regex komplett durchstrukturieren könnte. Du machst für den Wert eine Group und für die Übersetzung eine Group, dann hast du pro Match genau einen Key und einen Value für @Thunderbolts Dictionary.

    Dieser Beitrag wurde bereits 13 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Moin,

    die Aufgabe schreit nach einer Key-Value-Struktur. Du hast also einen Schlüssel, zu dem du einen Wert ermitteln möchtest. Es bietet sich also an, die gesamte Datenmenge einmal in ein Dictionary-Objekt zu laden, und dann darauf zuzugreifen. Ich kenne dein genaues Datenformat (in GameLanguage) nicht, daher nur mal grob umrissen:
    • GameLanguage an einem Trennzeichen auftrennen (vielleicht Zeilenumbruch?): Split-Methode
    • Jede Zeile dann am ersten : auftrennen. Hier funktioniert Split vielleicht nicht, wenn der Nutzwert ebenfalls : enthalten kann. Dann kann mit IndexOf und Substring Abhilfe geschaffen werden.
    • Die linke Seite ist der Schlüssel, die rechte Seite der Wert (hier vielleicht noch die Anführungszeichen entfernen → str.SubString(1, str.Length - 2).
    • Diese Daten in die Add-Methode des Dictionaries stopfen.
    Der Zugriff auf das Dictionary ist im Durchschnitt wesentlich schneller (O(1), d. h. die Zugriffszeit ist unabhängig von der Elementanzahl), als eine lineare Suche (O(n)). Zudem enthält dein durchsuchter String neben den Schlüsseln auch noch die Werte, also zusätzliche Informationen, die verarbeitet werden müssen, aber gar nicht relevant sind.
    Mit freundlichen Grüßen,
    Thunderbolt

    petaod schrieb:

    Kannst du nicht an der Stelle optimieren?


    Also, das Programm übersetzt in manchen Fällen ca. 6000 Werte in die entsprechende Sprache. Die Übersetzungen werden in einer Combobox zur Auswahl angeboten. (Das kostet auch noch mal paar Sekunden - da guck ich ob ich das vorher irgendwie noch filtere, dann würden auch nicht direkt 6000 Übersetzungen nötig...) Ich könnte auch vorab schon in einem extra Thread die Übersetzungen machen.]

    Thunderbolt schrieb:

    die Aufgabe schreit nach einer Key-Value-Struktur. Du hast also einen Schlüssel, zu dem du einen Wert ermitteln möchtest. Es bietet sich also an, die gesamte Datenmenge einmal in ein Dictionary-Objekt zu laden, und dann darauf zuzugreifen. Ich kenne dein genaues Datenformat (in GameLanguage) nicht, daher nur mal grob umrissen:


    Ich werde mir das Dictionary mal angucken, das könnte was sein...

    GameLanguage ist ein String, der mit dem kompletten Dateiinhalt einer Datei eingelesen wurde. Immer eine Zeile Pro Übersetzung. Dateiaufbau ist so:
    In Jeder Zeile der Key mit Doppelpunkt und Leerzeichen, danach die Übersetzung in Anführungszeichen

    Humax schrieb:

    Sprache

    Humax schrieb:

    Übersetzungen

    Humax schrieb:

    GameLanguage

    Humax schrieb:

    Ich werde mir das Dictionary mal angucken, das könnte was sein...
    Dass »Dictionary« übersetzt »Wörterbuch« heißt und damit wohl für diesen Fall den Nagel auf den Kopf trifft, dürfte ein Hinweis sein, dass das wohl das richtige sein wird …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.