英文:
Runtime optimization for regular expression
问题
大多数正则表达式在其生命周期中都是“常量”。使用全局正则表达式来加快执行速度是一个好主意吗?例如:
func work() {
r := regexp.MustCompile(`...`)
if r.MatchString(...) {
...
}
}
与以下代码进行比较:
var r *regexp.Regexp
func work() {
if r.MatchString(...) {
...
}
}
func init() {
r = regexp.MustCompile(`...`)
}
这两个版本有什么有意义的区别吗?
- 正则表达式的编译非常廉价,因此在CPU成本和垃圾回收方面都不值得使用全局正则表达式(假设
work()
被频繁调用)。 - 在适当的情况下,最好使用全局正则表达式。
以上哪个是正确的,或者答案并不是简单的黑白之分?
英文:
Most regular expression is "constant" in their life time. Is it a good idea to use global regular expression to speed up execution? For example:
func work() {
r := regexp.MustCompile(`...`)
if r.MatchString(...) {
...
}
}
comparing with:
var r *regexp.Regexp
func work() {
if r.MatchString(...) {
...
}
}
func init() {
r = regexp.MustCompile(`...`)
}
Do these 2 versions has any meaningful difference?
- Regular expression compiling is so cheap so that it is not worth to use global regex, both in term of CPU cost and garbage collecting (suppose
work()
is heavily called) - It is better to use global regular expression whenever approriate.
Which of the above is correct, or the answer is not simply black/white?
答案1
得分: 2
如果你只使用相同的正则表达式(例如"\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
英文:
if you use same regular expression(eg "\d+
") just once -> it is not worth to use global regex.
if you use same regular expression(eg "\d+
") often -> it is worth to use
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论