En écrivant un moteur de script, j'ai des fonctions comme (Psuedo-Code)
function is_whitespace?(char c){ return regex_match('\s',c); }
5 Réponses :
Bien sûr, quatre comparaisons de petits morceaux de mémoire sont grandement plus rapides (et n'utilisant presque pas de mémoire) que de bâtir, de courir et de détruire une machine à états. P>
+1. Notez que des exemples plus compliqués pourraient bien être plus rapides d'utiliser la regex.
Je suppose que c'est jamais, mais à la main-Code, un matcheur pour une langue régulière pourrait devenir très compliqué par rapport à la rédaction d'une regex.
Bien sûr, cela suppose que vous construisez votre moteur "comparaison manuelle" de telle sorte qu'il ne fait jamais plus de comparaisons qu'il n'a besoin. Finalement, cela réduirait quand même une machine d'État.
@Earlz: Tout d'abord, certaines personnes ont tendance à utiliser des regexnes pour des choses qui peuvent être écrites avec des comparaisons et une récupération de sous-chaîne. Deuxièmement, toute regex suffisamment compliquée ne peut être réécrite que dans les constructions de langue et rester lisible && soutenable.
@Earlz - Pour ce test spécifique, une regex serait surchargée. Mais la regex est incroyablement utile ... Par exemple, si votre fonction IS_WHITSPACE fait partie d'une classe qui fait des choses similaires que REGEX, vous pourrez peut-être remplacer le contenu de la classe entière avec quelques correspondances de regex. Mais si tout ce que vous êtes intéressé est une vitesse d'exécution nue, une regex pour une correspondance exacte triviale est surchargée.
@Earlz: J'ai entendu dire que les toxicomanes Perl aiment faire quoi que ce soit avec des regextes (au moins d'autres langues ne possédant pas de telles constructions indigènes comme ~ = =), mais il existe généralement des moyens plus propres et plus rapides de le faire. Et si les programmes de Python ne sont généralement pas perçus dans la perspective de performance, les détails de la mise en œuvre de .NET REGEXPS peuvent causer des cauchemars.
Dans la plupart des cas, la regex pour trouver une chose comme un caractère d'espacement est très rapide. Vous avez de nombreuses globes oculaires à examiner la performance dans les principales implémentations des regex et vous trouverez probablement d'autres domaines de «fruits de suspension faibles» pour l'optimisation dans d'autres domaines de votre code. p>
Les zones de mauvaise performance d'une regex sont une regex mal écrite. Les astuces sont à éviter autant de retournement, de regroupement et d'altération plus inutiles que possible. Utilisez quelque chose comme «Regex Buddy» ou Perl avec «Utilisez Re débogage» pour voir combien de branches votre regex prend votre regex. p>
Les liens sont des problèmes de performance de regex. p>
En cas de doute, faites des horaires comparatifs ... p>
Performances Java - Regex < / p>
La comparaison manuelle est plus rapide à exécuter, la comparaison des regex est plus rapide à taper. p>
Notez que vos deux implémentations ne sont pas équivalentes si votre système utilise Unicode. Le regex Si vous écrivez cela dans une langue de haut niveau, je suggère d'utiliser la fonction IS_WHITESPACE () déjà fournie par les bibliothèques de votre langue de programmation. Une fonction de base comme celle-ci est presque toujours incluse. P>
Donc, à la fin de la réponse est "Cela dépend". Dans certaines situations, les efforts de programmation supplémentaires d'utilisation du code procédural sont justifiés. Dans de nombreux cas, la regex est assez rapide et plus facile à entretenir. P> \ s code> correspond à tous les espaces blancheurs UNICODE pendant que votre comparaison manuelle ne traite que de base ASCII et n'inclut même pas l'onglet vertical et le formulaire de caractères d'alimentation qui sont généralement considérés comme des espaces. P>
Cela ne dépend donc-il que si votre mise en œuvre de regex est au courant de l'Unicode? (et votre langue. Par exemple, je pense que Ruby n'est toujours pas au courant de l'Unicode)
J'ai dit: "Si votre système utilise Unicode". Avec cela, je voulais dire à la fois le langage de programmation et la saveur de regex. La saveur de regex dans Ruby 1.8 ne prend pas en charge Unicode, celle de Ruby 1.9.
Après utilisation de disque, les regexes sont presque toujours mon goulot d'étranglement de la performance lorsque je profile mon code. Même pour des choses simples comme .split (""). p>
Je ne peux pas parler de C # ou C, mais je ne supposerais pas que le formulaire non-regex est plus rapide dans Ruby. P>
Semble assez simple pour préparer un test rapide pour le savoir. Générez un fichier rempli de caractères aléatoires et transmettez-le à la fois par les deux fonctions.
Je pense que vous vouliez dire '\ s' au lieu de "\ w" là-bas.
Oui, c'est vrai .. Mono devra suffire au test C # ..
@ Sepp2k, oui votre correct. Je pensais w = espace plutôt que S = espace ..