<div dir="ltr">для точности, речь идёт об одной регулярке, с менее чем 16 вариантами OR, или от 16 и более. Скорее всего зашито в движок PCRE.<div><br></div><div>вы скорее всего натолкнулись на один из внутренних лимитов.</div><div><br></div><div>решение простое - дробить на регулярки с максимум 15 вариантами OR.</div><div><br></div><div>P.S.: почему так - не знаю, но уверен, что это зашито в коде.</div></div><div class="gmail_extra"><br><div class="gmail_quote">28 октября 2016 г., 19:17 пользователь Loginoff Nick via Moscow-pm <span dir="ltr"><<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div> </div><div>Столкнулся с проблемой.</div><div> </div><div>В проекте есть список похожих регулярок (спам фильтр на домены, если точнее). Все регулярки сливаются в одну и потом идет матчинг.</div><div>Появилась проблема, что скрипт начал подвисать. По результату, накидал небольшой тест:</div><div> </div><div>Если регулярок 15 шт, то даже при увеличении строки до 100 символов, они работают быстро.</div><div>НО! Если регулярок 16 и более, то время увеличивается вдвое на каждое увеличение строки. Регулярка, которая совпадает, стоит последней в списке</div><div> </div><div>Пробовал на perl 5.10.1 и 5.8.8 и там и там работает так же.</div><div> </div><div>Вот код:</div><div> </div><div><div><div>#!/usr/bin/perl</div><div> </div><div>use strict;</div><div>use warnings;</div><div> </div><div>use Time::HiRes;</div><div> </div><div>$| = 1;</div><div> </div><div>my $regexp15 = qr('</div><div>(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(2\s*?(?:[^a-z]\s*?)+?r)</div><div>');</div><div> </div><div><div>my $regexp16 = qr('</div><div>(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(3\s*?(?:[^a-z]\s*?)+?r)</div><div>|(2\s*?(?:[^a-z]\s*?)+?r)</div><div>');</div><div> </div></div><div>print "Regexp 15:\n";</div><div>my $str = "1 2";</div><div>for (my $i=0;25>=$i;$i++) {</div><div>    $str .= " 1";</div><div>    my $start = Time::HiRes::gettimeofday();</div><div>    $str =~ $regexp15;    </div><div>    print "$i. " . ( Time::HiRes::gettimeofday() - $start )."\t\t".$str."\n";</div><div>}</div><div> </div><div>print "\n\nRegexp 16:\n";</div><div>$str = "1 2";</div><div>for (my $i=0;25>=$i;$i++) {</div><div>    $str .= " 1";</div><div>    my $start = Time::HiRes::gettimeofday();</div><div>    $str =~ $regexp16;    </div><div>    print "$i. " . ( Time::HiRes::gettimeofday() - $start )."\t\t".$str."\n";</div><div>}</div><div> </div></div></div><div> </div><div>На выводе получаем вот это:</div><div><div><div>Regexp 15:</div><div>0. 2.59876251220703e-05         1 2 1</div><div>1. 1.81198120117188e-05         1 2 1 1</div><div>2. 3.29017639160156e-05         1 2 1 1 1</div><div>3. 6.29425048828125e-05         1 2 1 1 1 1</div><div>4. 0.000128030776977539         1 2 1 1 1 1 1</div><div>5. 0.000234127044677734         1 2 1 1 1 1 1 1</div><div>6. 0.000262975692749023         1 2 1 1 1 1 1 1 1</div><div>7. 0.000327825546264648         1 2 1 1 1 1 1 1 1 1</div><div>8. 0.000325918197631836         1 2 1 1 1 1 1 1 1 1 1</div><div>9. 0.000358819961547852         1 2 1 1 1 1 1 1 1 1 1 1</div><div>10. 0.000417232513427734        1 2 1 1 1 1 1 1 1 1 1 1 1</div><div>11. 0.000411033630371094        1 2 1 1 1 1 1 1 1 1 1 1 1 1</div><div>12. 0.000481128692626953        1 2 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>13. 0.000468969345092773        1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>14. 0.000528097152709961        1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>15. 0.0005340576171875          1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>16. 0.000589132308959961        1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>17. 0.000611066818237305        1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>18. 0.000608921051025391        1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>19. 0.000670909881591797        1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>20. 0.000718832015991211        1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>21. 0.00074005126953125         1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>22. 0.000860929489135742        1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>23. 0.000805854797363281        1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>24. 0.000832080841064453        1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>25. 0.000850915908813477        1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div> </div><div>Regexp 16:</div><div>0. 9.05990600585938e-06         1 2 1</div><div>1. 1.69277191162109e-05         1 2 1 1</div><div>2. 3.31401824951172e-05         1 2 1 1 1</div><div>3. 6.29425048828125e-05         1 2 1 1 1 1</div><div>4. 0.000123023986816406         1 2 1 1 1 1 1</div><div>5. 0.000240087509155273         1 2 1 1 1 1 1 1</div><div>6. 0.000504970550537109         1 2 1 1 1 1 1 1 1</div><div>7. 0.000976085662841797         1 2 1 1 1 1 1 1 1 1</div><div>8. 0.00191593170166016          1 2 1 1 1 1 1 1 1 1 1</div><div>9. 0.00382804870605469          1 2 1 1 1 1 1 1 1 1 1 1</div><div>10. 0.00754117965698242         1 2 1 1 1 1 1 1 1 1 1 1 1</div><div>11. 0.0151779651641846          1 2 1 1 1 1 1 1 1 1 1 1 1 1</div><div>12. 0.0302209854125977          1 2 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>13. 0.0605261325836182          1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>14. 0.120044946670532           1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>15. 0.241585969924927           1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>16. 0.482980012893677           1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>17. 0.965275049209595           1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>18. 1.93135094642639            1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>19. 3.86527395248413            1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>20. 7.74077796936035            1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>21. 15.4553070068359            1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>22. 30.9984660148621            1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>23. 61.9043700695038            1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>24. 124.614840984344            1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div><div>25. 247.499380111694            1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1</div></div></div><span class="HOEnZb"><font color="#888888"><div> </div><div> </div><div>-- <br>С Уважением, Login|off Nick или STork.</div><div> </div></font></span><br>--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
<br></blockquote></div><br></div>