2010-09-28 16 views
6

Me han dicho que deshabilitar las referencias en perl mejora el rendimiento (siempre que no las esté utilizando), y que si no utiliza ninguna referencia posterior, perl lo hará por sí mismo.Deshabilitar las referencias en perl

ahora tengo un script de Perl con un gran número de expresiones regulares en ella y sólo uno solo utiliza una referencia hacia atrás y me gustaría saber lo siguiente:

  • Dado que tengo un muy gran número de expresiones regulares (Supongamos que la mayor parte de mi tiempo de procesamiento es regex) ¿Deshabilitar las referencias anteriores significa una mejora significativa en el rendimiento? o hay criterios que puedo utilizar para saber si este es el caso?
  • ¿Hay alguna manera de inhabilitar las referencias retrospectivas una vez al principio y solo volver a habilitarlas cuando las necesito (sé de (?:, pero no quiero tener que agregarlas a todas las agrupaciones)?
  • ¿El alcance permitiría que perl optimice este comportamiento de backreferencing para mí (es decir, hace un sub o un eval si el cambio perl apaga el backreferencing para cosas fuera de él)?
+1

* »suponiendo que la mayor parte de mi tiempo de procesamiento es regex« * O RLY? [Perfil] (http://p3rl.org/Devel::NYTProf) para (des) probar sus suposiciones. Apuesto a que su programa no es trivial y * no * pasará la mayor parte del tiempo en las expresiones regulares. – daxim

Respuesta

15

El uso de paréntesis de captura solo penaliza las expresiones regulares que los utilizan, así que úselos donde necesite capturar, pero utilice los parens (?:...) que no capturan cuando todo lo que necesita es la agrupación.

El uso de cualquiera de las variables globales partidos

$` $& $' 

impone una penalización de rendimiento en todas las expresiones regulares, por lo que evitar su uso si es posible. (¡Pero una vez que lo haces, te vuelves loco! Ya pagaste el precio). No hay forma de activarlo y desactivarlo. Una vez que Perl detecta que se usan en cualquier lugar (incluso en los módulos de terceros que puede usar), la función está activada.

A partir de Perl 5.10.0, existen alternativas para las variables de coincidencia global que solo penalizan las expresiones regulares que las utilizan. Si se agrega el modificador /p a una expresión regular a continuación, puede utilizar

${^PREMATCH} ${^MATCH} ${^POSTMATCH} 

lugar.

2

La única forma real de verificarlo es crear un perfil usted mismo. Eche un vistazo al módulo Benchmark (está en Core Perl, por lo que no tendrá que instalarlo). Establezca un par de puntos de referencia: uno donde tenga una función que tenga (digamos) diez expresiones regulares sin referencias retrospectivas, y una que tenga las mismas diez pero una de ellas use referencias retrospectivas.

Si encuentra que la retroreferencia, incluida la expresión regular, realmente ralentiza el resto de sus expresiones regulares, quizás intente volver a escribir esa para no incluir la retro-referencia de alguna manera ...?

+0

Por lo tanto, la evaluación comparativa me ayuda a tomar esta decisión para esta pieza de código en particular, pero esperaba algo de información para poder tomar esta decisión más adelante. El resultado final aquí es que no entiendo mucho acerca de deshabilitar/habilitar la retroalimentación y estoy tratando de obtener más información para poder tomar una decisión informada. – tzenes

Cuestiones relacionadas