Это больше из любопытства, чем что-либо еще, так как я не могу найти в Google полезную информацию об этой функции (CORE :: substcont)
При профилировании и оптимизации какого-то старого, медленного кода синтаксического анализа XML я обнаружил, что следующее регулярное выражение 31 раз вызывает substcont при каждом выполнении строки и занимает огромное количество времени:
Звонки: 10000 Время: 2,65 с Подзвонки: 320000 Время в абонентах: 1,15 с`
$handle =~s/(>)\s*(<)/$1\n$2/g;
# spent 1.09s making 310000 calls to main::CORE:substcont, avg 4µs/call
# spent 58.8ms making 10000 calls to main::CORE:subst, avg 6µs/call
По сравнению с предыдущей строкой:
Звонки: 10000 Время: 371 мс. Дополнительные вызовы: 30000 Время в абонентах: 221 мс
$handle =~s/(.*)\s*(<\?)/$1\n$2/g;
# spent 136ms making 10000 calls to main::CORE:subst, avg 14µs/call
# spent 84.6ms making 20000 calls to main::CORE:substcont, avg 4µs/call
Количество вызовов subcont довольно удивительно, особенно если учесть, что я бы подумал, что второе регулярное выражение будет дороже. Именно поэтому профилирование - это хорошо; -)
Впоследствии я изменил обе эти строки, чтобы удалить ненужные ссылки, с драматическими результатами для строки с плохим поведением:
Звонки: 10000 Время: 393 мс Суб звонки: 10000 Время в сабвуферах: 341 мс
$handle =~s/>\s*</>\n</g;
# spent 341ms making 10000 calls to main::CORE:subst, avg 34µs/call
- Итак, мой вопрос - почему оригинал должен был делать так много обращений к substcont, и что subcont вообще делает в движке регулярных выражений, который занимает столько времени?