golang高性能并行目录遍历插件库fastwalkfzf的使用
Golang高性能并行目录遍历插件库fastwalk的使用
fastwalk是一个用于Golang的快速并行目录遍历库,它提供了比标准库filepath.WalkDir
更高效的性能。
特性
- 快速:使用多个goroutine并发遍历文件系统并调用回调函数
- 安全的符号链接遍历(通过
Config.Follow
配置) - 与
filepath.WalkDir
相同的行为和回调签名 - 提供忽略重复文件和目录的包装函数:
IgnoreDuplicateFiles()
和IgnoreDuplicateDirs()
- 在macOS、Linux和Windows上经过广泛测试
性能优势
fastwalk相比标准库filepath.WalkDir
:
- 在macOS上快约2.5倍
- 在Linux上快约4倍
- 在Windows上快约6倍
- 内存分配减少50%
- 内存分配次数减少25%
相比godirwalk库,fastwalk在各种操作系统上都快约4-5倍。
使用示例
下面是一个类似POSIX find工具的简单实现示例:
// fwfind是一个类似POSIX find的示例程序,但更快(这是一个示例)
package main
import (
"flag"
"fmt"
"io/fs"
"os"
"path/filepath"
"github.com/charlievieth/fastwalk"
)
const usageMsg = `Usage: %[1]s [-L] [-name] [PATH...]:
%[1]s是POSIX find工具的简单替代品
`
func main() {
flag.Usage = func() {
fmt.Fprintf(os.Stdout, usageMsg, filepath.Base(os.Args[0]))
flag.PrintDefaults()
}
pattern := flag.String("name", "", "匹配文件名的模式")
followLinks := flag.Bool("L", false, "跟随符号链接")
flag.Parse()
// 如果没有提供路径,默认为当前目录"."
args := flag.Args()
if len(args) == 0 {
args = append(args, ".")
}
// 如果提供了"-L"标志,则跟随链接
conf := fastwalk.Config{
Follow: *followLinks,
}
walkFn := func(path string, d fs.DirEntry, err error) error {
if err != nil {
fmt.Fprintf(os.Stderr, "%s: %v\n", path, err)
return nil // 返回错误会停止迭代
}
if *pattern != "" {
if ok, err := filepath.Match(*pattern, d.Name()); !ok {
// 无效模式(err != nil)或名称不匹配
return err
}
}
_, err = fmt.Println(path)
return err
}
for _, root := range args {
if err := fastwalk.Walk(&conf, root, walkFn); err != nil {
fmt.Fprintf(os.Stderr, "%s: %v\n", root, err)
os.Exit(1)
}
}
}
基准测试
Darwin (macOS)
硬件配置:
goos: darwin
goarch: arm64
cpu: Apple M1 Max
filepath.WalkDir vs. fastwalk.Walk():
filepath fastwalk delta
time/op 27.9ms ± 1% 13.0ms ± 1% -53.33%
alloc/op 4.33MB ± 0% 2.14MB ± 0% -50.55%
allocs/op 50.9k ± 0% 37.7k ± 0% -26.01%
godirwalk.Walk() vs. fastwalk.Walk():
godirwalk fastwalk delta
time/op 58.5ms ± 3% 18.0ms ± 2% -69.30%
alloc/op 25.3MB ± 0% 2.1MB ± 0% -91.55%
allocs/op 57.6k ± 0% 37.7k ± 0% -34.59%
Linux
硬件配置:
goos: linux
goarch: amd64
cpu: Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz
drive: Samsung SSD 970 PRO 1TB
filepath.WalkDir vs. fastwalk.Walk():
filepath fastwalk delta
time/op 10.1ms ± 2% 2.8ms ± 2% -72.83%
alloc/op 2.44MB ± 0% 1.70MB ± 0% -30.46%
allocs/op 47.2k ± 0% 36.9k ± 0% -21.80%
godirwalk.Walk() vs. fastwalk.Walk():
filepath fastwalk delta
time/op 13.7ms ±16% 2.8ms ± 2% -79.88%
alloc/op 7.48MB ± 0% 1.70MB ± 0% -77.34%
allocs/op 53.8k ± 0% 36.9k ± 0% -31.38%
Windows
硬件配置:
goos: windows
goarch: amd64
pkg: github.com/charlievieth/fastwalk
cpu: Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz
filepath.WalkDir vs. fastwalk.Walk():
filepath fastwalk delta
time/op 88.0ms ± 1% 14.6ms ± 1% -83.47%
alloc/op 5.68MB ± 0% 6.76MB ± 0% +19.01%
allocs/op 69.6k ± 0% 90.4k ± 0% +29.87%
godirwalk.Walk() vs. fastwalk.Walk():
filepath fastwalk delta
time/op 87.4ms ± 1% 14.6ms ± 1% -83.34%
alloc/op 6.14MB ± 0% 6.76MB ± 0% +10.24%
allocs/op 100k ± 0% 90k ± 0% -9.59%
更多关于golang高性能并行目录遍历插件库fastwalkfzf的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复