Heim  >  Artikel  >  Backend-Entwicklung  >  Laufzeitoptimierung regulärer Ausdrücke

Laufzeitoptimierung regulärer Ausdrücke

王林
王林nach vorne
2024-02-11 10:15:08666Durchsuche

Laufzeitoptimierung regulärer Ausdrücke

php-Editor Youzi führt Sie in die Laufzeitoptimierung regulärer Ausdrücke ein. Reguläre Ausdrücke sind ein leistungsstarkes Tool zum Abgleichen und Verarbeiten von Zeichenfolgen, können jedoch bei der Arbeit mit großen Datenmengen zu Leistungsproblemen führen. Um die Ausführungseffizienz regulärer Ausdrücke zu verbessern, können wir einige Optimierungsstrategien anwenden, z. B. die Verwendung von Lazy Matching, die Vermeidung von Backtracking und die Verwendung präziserer Matching-Muster. Diese Optimierungstechniken können uns helfen, reguläre Ausdrücke in der tatsächlichen Entwicklung effizienter zu nutzen und die Programmleistung zu verbessern.

Frageninhalt

Die meisten regulären Ausdrücke sind während ihrer Lebensdauer „konstant“. Ist es eine gute Idee, globalereguläre Ausdrücke zu verwenden, um die Ausführung zu beschleunigen? Zum Beispiel:

func work() {
    r := regexp.mustcompile(`...`)
    if r.matchstring(...) {
        ...
    }
}

Vergleichen:

var r *regexp.Regexp

func work() {
    if r.MatchString(...) {
        ...
    }
}

func init() {
    r = regexp.MustCompile(`...`)
}

Gibt es bedeutende Unterschiede zwischen diesen beiden Versionen?

  1. Regex-Kompilierung ist sehr kostengünstig, daher lohnt es sich aus Sicht der CPU-Kosten und der Speicherbereinigung nicht, globale Regex zu verwenden (vorausgesetzt, work() wird stark aufgerufen)
  2. Am besten verwenden Sie gegebenenfalls globale reguläre Ausdrücke.

Welche der oben genannten Aussagen ist richtig oder ist die Antwort nicht einfach schwarz/weiß?

Workaround

Wenn Sie denselben regulären Ausdruck nur einmal verwenden (z. B. „d+“) -> lohnt es sich nicht, einen globalen regulären Ausdruck zu verwenden.

Wenn Sie häufig denselben regulären Ausdruck verwenden (z. B. „d+“) –> dann lohnt es sich,

zu verwenden
func benchmark01(b *testing.b) {
    for i := 0; i < b.n; i++ {
        r := regexp.mustcompile(`\d+`)
        r.matchstring("aaaaaaa123bbbbbbb")
    }
}

func benchmark02(b *testing.b) {
    r := regexp.mustcompile(`\d+`)
    for i := 0; i < b.n; i++ {
        r.matchstring("aaaaaaa123bbbbbbb")
    }
}
Benchmark01
Benchmark01-4             886909              1361 ns/op
Benchmark02
Benchmark02-4            5368380               232.8 ns/op

Das obige ist der detaillierte Inhalt vonLaufzeitoptimierung regulärer Ausdrücke. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen