Web Analytics

fastwalk

⭐ 139 stars Korean by charlievieth

GoDoc Test fastwalk on macOS Test fastwalk on Linux Test fastwalk on Windows

fastwalk

Golang을 위한 빠른 병렬 디렉터리 탐색기.

fastwalk 패키지는 filepath.WalkDir의 빠른 병렬 버전을 제공하며, macOS에서는 약 2.5배, Linux에서는 약 4배, Windows에서는 약 6배 더 빠르고, 메모리 할당은 50% 적으며, 메모리 할당 횟수는 25% 적게 요구합니다. 또한, OS 전반에 걸쳐 godirwalk보다 약 4-5배 빠릅니다.

golang.org/x/tools/internal/fastwalk에서 영감을 받고 기반하여 작성되었습니다.

특징

filepath.WalkDirFunc 콜백을 동시에 호출 IgnoreDuplicateFiles()IgnoreDuplicateDirs()

사용법

사용법은 filepath.WalkDir와 같지만, fastwalk.Walk에 전달되는 walkFn 인자는 동시 사용에 안전해야 합니다.

예제는 examples 디렉터리에서 확인할 수 있습니다.

아래 예제는 POSIX의 매우 간단한 버전의 find 유틸리티입니다:

// fwfind is a an example program that is similar to POSIX find,
// but faster and worse (it's an example).
package main

import ( "flag" "fmt" "io/fs" "os" "path/filepath"

"github.com/charlievieth/fastwalk" )

const usageMsg = Usage: %[1]s [-L] [-name] [PATH...]:

%[1]s is a poor replacement for the POSIX find utility

func main() { flag.Usage = func() { fmt.Fprintf(os.Stdout, usageMsg, filepath.Base(os.Args[0])) flag.PrintDefaults() } pattern := flag.String("name", "", "Pattern to match file names against.") followLinks := flag.Bool("L", false, "Follow symbolic links") flag.Parse()

// If no paths are provided default to the current directory: "." args := flag.Args() if len(args) == 0 { args = append(args, ".") }

// Follow links if the "-L" flag is provided 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 // returning the error stops iteration } if *pattern != "" { if ok, err := filepath.Match(*pattern, d.Name()); !ok { // invalid pattern (err != nil) or name does not match 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) } } }

벤치마크

벤치마크는 go1.17.6을 사용하여 생성되었으며 bench_comp 메이크 타겟으로 생성할 수 있습니다:

$ make bench_comp

다윈

하드웨어:

goos: darwin
goarch: arm64
cpu: Apple M1 Max

#### filepath.WalkDirfastwalk.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%

리눅스

하드웨어:

goos: linux
goarch: amd64
cpu: Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz
drive: Samsung SSD 970 PRO 1TB

#### filepath.WalkDirfastwalk.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%

윈도우

하드웨어:

goos: windows
goarch: amd64
pkg: github.com/charlievieth/fastwalk
cpu: Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz

#### filepath.WalkDirfastwalk.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()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%

--- Tranlated By Open Ai Tx | Last indexed: 2026-05-17 ---