Большинство регулярных выражений являются «постоянными» в течение всего времени их жизни. Стоит ли использовать глобальное регулярное выражение для ускорения выполнения? Например:
func work() {
r := regexp.MustCompile(`...`)
if r.MatchString(...) {
...
}
}
сравнивая с:
var r *regexp.Regexp
func work() {
if r.MatchString(...) {
...
}
}
func init() {
r = regexp.MustCompile(`...`)
}
Есть ли у этих 2-х версий какая-то значимая разница?
work()
сильно вызывается)Что из вышеперечисленного верно, или ответ не просто черный/белый?
Независимо от соображений производительности, если регулярное выражение полностью находится под вашим контролем (в отличие от заданного пользователем) и имеет неверный формат, не хотите ли вы, чтобы выполнение завершилось ошибкой как можно скорее, то есть при инициализации пакета, а не при первом вызове. вашей work
функции? Ответ на этот вопрос должен определять ваше решение объявить регулярное выражение на уровне пакета.
если вы используете одно и то же регулярное выражение (например, «\d+
») только один раз -> не стоит использовать глобальное регулярное выражение.
если вы часто используете одно и то же регулярное выражение (например, "\d+
") -> стоит использовать
func Benchmark01(b *testing.B) {
for i := 0; i < b.N; i++ {
r := regexp.MustCompile(`\d+`)
r.MatchString("aaaaaaa123bbbbbbb")
}
}
func Benchmark02(b *testing.B) {
r := regexp.MustCompile(`\d+`)
for i := 0; i < b.N; i++ {
r.MatchString("aaaaaaa123bbbbbbb")
}
}
Benchmark01
Benchmark01-4 886909 1361 ns/op
Benchmark02
Benchmark02-4 5368380 232.8 ns/op
Используйте один оператор для объявления и инициализации переменной уровня пакета:
var r = regexp.MustCompile(`...`)
.