博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang遍历目录树性能对比
阅读量:3986 次
发布时间:2019-05-24

本文共 1690 字,大约阅读时间需要 5 分钟。

查找 dir 目录下文件名中包含 dst 字符串的文件个数,遇到目录则递归遍历。

最直接的方法:

package mainimport (   "fmt"   "io/ioutil"   "strings"   "time")var dst = "main"var dir = "D:/dev"var c = 0// 查找目录树func main() {
main1()}func main1() {
start := time.Now() search1(dir) fmt.Println(c) use := time.Since(start) fmt.Println(use)}func search1(dir string) {
fs, err := ioutil.ReadDir(dir) if err != nil {
panic(err) } for _, f := range fs {
if f.IsDir() {
search1(dir + "/" + f.Name()) } else {
if strings.Contains(f.Name(), dst) {
c++ } } }}

耗时 30 s

找出 1562 个结果

采用 goroutine 优化后

package mainimport (	"fmt"	"io/ioutil"	"strings"	"time")var dst = "main"var dir = "D:/dev"var c = 0// 查找目录树func main() {
main3()}var gorCount = 0var maxGorCount = 30var haveResult = make(chan bool)var gorDone = make(chan bool)var gorStart = make(chan string)func main3() {
start := time.Now() gorCount = 1 go search3(dir, true) waitGor() fmt.Println(c) use := time.Since(start) fmt.Println(use)}func waitGor() {
for {
select {
case <-gorDone: gorCount-- if gorCount == 0 {
return } case dirname := <-gorStart: gorCount++ go search3(dirname, true) case <-haveResult: c++ } }}func search3(dir string, gor bool) {
fs, err := ioutil.ReadDir(dir) if err == nil {
for _, f := range fs {
if f.IsDir() {
if gorCount >= maxGorCount {
search3(dir+"/"+f.Name(), false) } else {
gorStart <- dir + "/" + f.Name() } } else {
if strings.Contains(f.Name(), dst) {
haveResult <- true } } } } else {
fmt.Println(err) } if gor {
gorDone <- true }}

耗时为 4s,想你提升 7 倍左右

转载地址:http://pnaui.baihongyu.com/

你可能感兴趣的文章
flutter-实现一个下拉刷新上拉加载的列表
查看>>
android 代码实现圆角
查看>>
postman调试webservice接口
查看>>
retrofit调试webservice(注意只是调试,没对结果进行处理)
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
Android DataBinding使用1-普通页面
查看>>
Android DataBinding使用2-Recycleview
查看>>
Dart数据类型
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>
JavaScript基础知识(2)
查看>>
重温activity生命周期
查看>>
转载一个webview开车指南以及实际项目中的使用
查看>>
关于activity保存页面状态的两个方法
查看>>
android中对于非属性动画的整理
查看>>
一个简单的TabLayout的使用
查看>>
关于let{a}=B出现的解构赋值
查看>>
ReactNative使用Redux例子
查看>>