我正在将文本模式扫描仪从 Python3 转换为 Go1.10,但令我惊讶的是它实际上慢了 2 倍。分析后,罪魁祸首在strings.Contains()
. 请参阅下面的简单基准。我错过了什么吗?您能否推荐一种更快的 Go 模式搜索算法,在这种情况下性能会更好?我不关心启动时间,相同的模式将用于扫描数百万个文件。
Py3 基准测试:
import time
import re
RUNS = 10000
if __name__ == '__main__':
with open('data.php') as fh:
testString = fh.read()
def do():
return "576ad4f370014dfb1d0f17b0e6855f22" in testString
start = time.time()
for i in range(RUNS):
_ = do()
duration = time.time() - start
print("Python: %.2fs" % duration)
Go1.10 基准测试:
package main
import (
"fmt"
"io/ioutil"
"log"
"strings"
"time"
)
const (
runs = 10000
)
func main() {
fname := "data.php"
testdata := readFile(fname)
needle := "576ad4f370014dfb1d0f17b0e6855f22"
start := time.Now()
for i := 0; i < runs; i++ {
_ = strings.Contains(testdata, needle)
}
duration := time.Now().Sub(start)
fmt.Printf("Go: %.2fs\n", duration.Seconds())
}
func readFile(fname string) string {
data, err := ioutil.ReadFile(fname)
if err != nil {
log.Fatal(err)
}
return string(data)
}
data.php
是一个 528KB 的文件,可以在这里找到。
输出:
Go: 1.98s
Python: 0.84s