Различная продолжительность выполнения с помощью `go run` и` go build` - PullRequest
0 голосов
/ 18 января 2019

Почему время выполнения моей программы изменяется, когда я использую go run против go build и выполняю свою программу?

Я использую пакет time для измерения времени, прошедшего во время выполнения программы, и наткнулся на это поведение.

package main

import (
    "fmt"
    "io/ioutil"
    "time"
)

func sumInt(b []byte, c chan int) {
    sum := 0
    for _, num := range b {
        sum += int(num)
    }
    c <- sum
}

func main() {
    start := time.Now()

    dat, err := ioutil.ReadFile("nums.txt")
    if err != nil {
        return
    }

    partSum1 := make(chan int)
    partSum2 := make(chan int)

    go sumInt(dat[:len(dat)/2], partSum1)
    go sumInt(dat[len(dat)/2:], partSum2)

    sum := <-partSum1 + <-partSum2
    fmt.Println(sum)

    elapsed := time.Since(start)
    fmt.Printf("Elapsed %s\n", elapsed)
}
❱ go run runtime.go 
2502263
Elapsed 133.893µs
❱ go build runtime.go 
❱ ./runtime 
2502263
Elapsed 402.435µs
❱ 

1 Ответ

0 голосов
/ 19 января 2019

В Go мы не поддерживаем бессмысленные микробенчмарки. Если вы собираетесь запустить тест, используйте пакет Go testing.

Например,

Выход:

$ go test sum_test.go -bench=. -benchmem
goos: linux
goarch: amd64
BenchmarkSum-8    500000    2905 ns/op    4288 B/op    3 allocs/op
$

sum_test.go:

package main

import (
    "testing"
)

func sumInt(b []byte, c chan int) {
    sum := 0
    for _, num := range b {
        sum += int(num)
    }
    c <- sum
}

func BenchmarkSum(b *testing.B) {
    for N := 0; N < b.N; N++ {
        dat := make([]byte, 4*1024)
        partSum1 := make(chan int)
        partSum2 := make(chan int)
        go sumInt(dat[:len(dat)/2], partSum1)
        go sumInt(dat[len(dat)/2:], partSum2)
        sum := <-partSum1 + <-partSum2
        _ = sum
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...