Maison >développement back-end >Golang >Optimisation de l'exécution des expressions régulières

Optimisation de l'exécution des expressions régulières

王林
王林avant
2024-02-11 10:15:08691parcourir

Optimisation de lexécution des expressions régulières

l'éditeur php Youzi vous présentera l'optimisation du runtime des expressions régulières. Les expressions régulières sont un outil puissant pour la correspondance et le traitement des chaînes, mais elles peuvent entraîner des problèmes de performances lorsque vous travaillez avec des données à grande échelle. Afin d'améliorer l'efficacité d'exécution des expressions régulières, nous pouvons adopter certaines stratégies d'optimisation, telles que l'utilisation de la correspondance paresseuse, l'évitement du recours au retour en arrière et l'utilisation de modèles de correspondance plus précis. Ces techniques d'optimisation peuvent nous aider à utiliser les expressions régulières plus efficacement dans le développement réel et à améliorer les performances du programme.

Contenu de la question

La plupart des expressions régulières sont "constantes" tout au long de leur vie. Est-ce une bonne idée d'utiliser des expressions régulières global pour accélérer l'exécution ? Par exemple :

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

Comparez :

var r *regexp.Regexp

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

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

Y a-t-il des différences significatives entre ces deux versions ?

  1. La compilation Regex est très bon marché, donc du point de vue du coût du processeur et du garbage collection, cela ne vaut pas la peine d'utiliser une regex globale (en supposant que work() soit appelé fortement)
  2. Il est préférable d’utiliser des expressions régulières globales lorsque cela est approprié.

Laquelle des réponses ci-dessus est correcte, ou la réponse n'est-elle pas simplement noire/blanche ?

Solution de contournement

Si vous n'utilisez la même regex qu'une seule fois (par exemple "d+") -> cela ne vaut pas la peine d'utiliser une regex globale.

Si vous utilisez souvent la même expression régulière (par exemple "d+") ->

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer