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

王林
Libérer: 2024-02-11 10:15:08
avant
731 Les gens l'ont consulté

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(...) {
        ...
    }
}
Copier après la connexion

Comparez :

var r *regexp.Regexp

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

func init() {
    r = regexp.MustCompile(`...`)
}
Copier après la connexion

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")
    }
}
Copier après la connexion
Benchmark01
Benchmark01-4             886909              1361 ns/op
Benchmark02
Benchmark02-4            5368380               232.8 ns/op
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal