问题
我现在正在对多个文件运行正则表达式 grep 以获取所有 TODO,但是命令完成需要几分钟时间:
real 5m8.073s
user 0m35.593s
sys 4m17.608s
瞄准
目标是立即获取 TODO 的数量。
尝试
根据网上的资料,我认为 Golang 是一个不错的选择,因此我创建了以下代码。
func check_for_todo(path string) {
text := "//\\sTODO\\s\\d"
b, err := ioutil.ReadFile(path)
if err != nil {
panic(err)
}
s := string(b)
// containsTodo := strings.Contains(s, text)
containsTodo, _ := regexp.MatchString(text, s)
if containsTodo {
numberOfTodos++
fmt.Println("This file contains a todo:", path)
}
}
结果
现在查询速度是 bash 的两倍。
real 2m17.050s
user 0m0.015s
sys 0m0.015s
讨论
我觉得这段代码可以优化并且目前是曲折的。我现在正在研究 channel 和协程。
最佳答案
您可能想查看 the silver searcher 所做的优化(又名 ag
)。它进行了大量优化以实现极快的代码搜索。
另一种选择可能是预先构建索引,这样搜索速度甚至比实时执行的任何操作都要快。在 ag
自述文件中,exuberant ctags被引用,它执行此操作并且可以用于非常大的代码库。
关于go - 什么是 `regex grep` ,应用于文件,Golang 中的等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52246487/