问题
我现在正在为多个文件运行一个正则表达式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
讨论
我觉得这个代码可以优化,目前是狡猾的。我现在正在寻找渠道和goroutines。
您可能想查看the silver searcher(a.k.a ag
)所做的优化。它进行了许多优化,以便进行极快的代码搜索。
另一种选择可能是预构建索引,因此搜索甚至比实时执行的任何操作都快。在ag
自述文件中,引用了exuberant ctags来执行此操作,并且可以用于极大的代码库。