У меня есть приложение, которое запускает несколько процессов.Каждый процесс загружает файл HTML и пытается найти, присутствует ли в нем шаблон, что-то вроде этого:
OUTER:
while(my ($prov,$arr_ref) = each(%{$self->{TAGS}})) {
foreach my $tag (@{$arr_ref}) {
if ($html =~ m/\Q$tag\E/i) {
$provider = $prov;
last OUTER;
}
}
}
$self->{TAGS}
ключ - это имя шаблона, а значение - это ссылка на массив со строками (скаляры).
Я профилировал программу и обнаружил, что эта часть:
$html =~ m/\Q$tag\E/i
заставляет мой процессор подскочить до 100%.Если я удаляю его, он едва достигает 10%.
Я имею в виду только один подход, который превращает все скаляры (строки) внутри каждого массива ref в скомпилированное регулярное выражение (qr/.../
).Я полагаю, что это не так сильно улучшится, поскольку, на самом деле, проблема заключается в том, что регулярное выражение выполняет поиск по всем HTML-страницам, размер которых может достигать сотен байтов.
Что можно сделать, чтобы улучшить этораздел?
ПОДРАЗДЕЛ: из-за ответов ниже, и некоторые тесты, которые я сделал, я уточню свой вопрос, проблема не в регулярном выражении, я уже попробовал index
задолго до того, как я задал этот вопрос, также попробовал скомпилированное регулярное выражение с qr//
, эта проблема, с размером html-файлов, содержимым $html
является текст HTML, иногда его маленький, а иногда большой, поэтому проблема здесьЧТО ТАКОЕ ЛУЧШИЙ СПОСОБ (с точки зрения ресурсов ...) НАЙТИ, ЕСЛИ СТРОКА ВНУТРИ БОЛЬШОЙ (ПОЗВОЛЯЕТ 1 МБ НА РАЗМЕРЕ) СТРОКУ?
Спасибо.