登录
首页 >  Golang >  Go问答

Golang 中带和不带空白标识符的计时

来源:stackoverflow

时间:2024-04-02 22:48:36 148浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Golang 中带和不带空白标识符的计时》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

我正在研究 go 中的一些基本计时并有一个问题。我想对 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])
}

平均给出大约 36ms:

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))
}

平均时间约为 92ms

time taken:  92.121481ms

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

顺便说一句,我发现 python 中的相同计算如果广播大约需要 20 毫秒,如果循环则需要几百毫秒。


解决方案


如果你想要相同的结果,就做同样的事情!显然,分配不会是免费的!不要注释掉分配!

例如,

输出:

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()
}

今天关于《Golang 中带和不带空白标识符的计时》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>