Golang 中带和不带空白标识符的计时
短信预约 -IT技能 免费直播动态提醒
本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《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 中带和不带空白标识符的计时》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注编程网公众号!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341