diff --git a/benchmem03.txt b/benchmem03.txt new file mode 100644 index 0000000..3885747 --- /dev/null +++ b/benchmem03.txt @@ -0,0 +1,6 @@ +goos: linux +goarch: amd64 +pkg: github.com/Serares/coolStats +BenchmarkRun-16 10 92313063 ns/op 215030855 B/op 2529386 allocs/op +PASS +ok github.com/Serares/coolStats 1.187s diff --git a/main.go b/main.go index 0fdd5cf..00a8477 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "os" + "sync" ) func main() { @@ -37,25 +38,49 @@ func run(filenames []string, op string, column int, out io.Writer) error { } consolidate := make([]float64, 0) + resCh := make(chan []float64) + errCh := make(chan error) + doneCh := make(chan struct{}) + wg := sync.WaitGroup{} for _, fname := range filenames { - f, err := os.Open(fname) - if err != nil { - return fmt.Errorf("cannot open file: %w", err) - } + wg.Add(1) + go func(fname string) { + defer wg.Done() + f, err := os.Open(fname) + if err != nil { + errCh <- fmt.Errorf("cannot open file: %w", err) + return + } - data, err := csv2float(f, column) - if err != nil { - return err - } + data, err := csv2float(f, column) + if err != nil { + errCh <- err + } - if err := f.Close(); err != nil { - return err - } + if err := f.Close(); err != nil { + errCh <- err + } + + resCh <- data + }(fname) - consolidate = append(consolidate, data...) } - _, err := fmt.Fprintln(out, opFunc(consolidate)) - return err + go func() { + wg.Wait() + close(doneCh) + }() + + for { + select { + case err := <-errCh: + return err + case data := <-resCh: + consolidate = append(consolidate, data...) + case <-doneCh: + _, err := fmt.Fprintln(out, opFunc(consolidate)) + return err + } + } } diff --git a/trace02.out b/trace02.out new file mode 100644 index 0000000..87251ec Binary files /dev/null and b/trace02.out differ