-2

我正在玩围棋中的一些基本时间并有一个​​问题。我想给 Golang 计算一个数组每个元素的平方根的时间,但是无论我是否保留输出,我都会得到两个不同的答案。这是我的第一个版本:

package main

import ("fmt"
        "time" 
        "math"
        "math/rand"
)

// A random array of integers 
func randomArray(max int ,len int) []int {
    a := make([]int, len)
    for i := 0; i <= len-1; i++ {
        a[i] = rand.Intn(max)
    }
    return a
}

// Taking square root of each element in array
func sqrt_array(arr [] int) [] float64 {
    var len_arr = len(arr)
    a := make([]float64, len_arr)
    for i, v := range arr {
    a[i] = math.Sqrt(float64(v))
    }
    return a
}


func main() {

    arr := randomArray(100, 10e6)
    sqrt := make([]float64, len(arr))
    start := time.Now()
    sqrt = sqrt_array(arr)
    end := time.Now()

    fmt.Println("time taken: ", end.Sub(start), sqrt[0])
}

平均大约 36 毫秒:

time taken:  36.542019ms 9

现在,当我用空白标识符替换输出“sqrt”时,我得到的东西要慢得多。具体来说,我将 main() 替换为

func main() {

    arr := randomArray(100, 10e6)
    // sqrt := make([]float64, len(arr))
    start := time.Now()
    _ = sqrt_array(arr)
    end := time.Now()

    fmt.Println("time taken: ", end.Sub(start))
}

平均得到大约 92 毫秒

time taken:  92.121481ms

有人能解释发生了什么吗?我觉得如果我理解了,我可能会学到一些关于 Go 的东西。

顺便说一句,我发现 Python 中的相同计算在广播时约为 20 毫秒,如果在循环中则为数百毫秒。

4

2 回答 2

0

如果您想要相同的结果,请执行相同的操作!显然,分配不会是免费的!不要注释掉分配!

例如,

输出:

time taken:  77.726729ms 9
time taken:  78.213242ms 0

main.go

package main

import (
    "fmt"
    "math"
    "math/rand"
    "testing"
    "time"
)

// A random array of integers
func randomArray(max int, len int) []int {
    a := make([]int, len)
    for i := 0; i <= len-1; i++ {
        a[i] = rand.Intn(max)
    }
    return a
}

// Taking square root of each element in array
func sqrt_array(arr []int) []float64 {
    var len_arr = len(arr)
    a := make([]float64, len_arr)
    for i, v := range arr {
        a[i] = math.Sqrt(float64(v))
    }
    return a
}

func main1() {

    arr := randomArray(100, 10e6)
    sqrt := make([]float64, len(arr))
    start := time.Now()
    sqrt = sqrt_array(arr)
    end := time.Now()

    fmt.Println("time taken: ", end.Sub(start), sqrt[0])
}

func main2() {

    arr := randomArray(100, 10e6)
    // sqrt := make([]float64, len(arr))
    sqrt := make([]float64, len(arr))
    start := time.Now()
    _ = sqrt_array(arr)
    end := time.Now()

    fmt.Println("time taken: ", end.Sub(start), sqrt[0])
}

func main() {
    main1()
    main2()
}
于 2019-03-10T08:17:02.913 回答
0

@Not_a_Golfer 这是一个有趣的想法,谢谢!我将 sqrt_array 替换为

func sqrt_array(arr [] int) [] float64 {
    var len_arr = len(arr)
    a := make([]float64, len_arr)
    s := time.Now()
    for i, v := range arr {
    a[i] = math.Sqrt(float64(v))
    }
    e := time.Now()
    fmt.Println("time taken: ", e.Sub(s))
    return a
}

并发现我使用的第一个 main() 给出:

耗时:30.455811ms
耗时:36.419998ms 9

而第二个给出

耗时:30.916246ms
耗时:90.815387ms

我认为这表明两种方法的计算时间大致相同(30ms)。在第二个选项中删除数组确实可能有一些时间成本(60 毫秒左右)。虽然这很奇怪,因为它应该只是删除一个指针

于 2019-03-10T10:37:23.563 回答