gpt4 book ai didi

go - 使用GC负责90%的CPU时间

转载 作者:行者123 更新时间:2023-12-01 20:24:15 25 4
gpt4 key购买 nike

我正在用Go编写一种虚拟机,用于一种简单的编造编程语言。我正在使用探查器pprof来提高性能。我正在用自己的组合语言运行Fibonacci函数以测试递归函数。

func fib(n) {
if n < 2 {
return n
} else {
return fib(n-1) + fib(n-2)
}
}
print fib(34)

当我运行它时,它需要14秒,而在Python中则需要2秒。这是PProf的图片。我用绿色突出显示了我的实际程序的函数调用。他们花了2秒钟,其他12秒钟似乎都是Go的垃圾收集器。
enter image description here
有什么办法可以弄清为什么垃圾收集器要花费这么多时间?

最佳答案

作为icza noted in a comment,实际上将其作为Go代码进行编译和运行,因此运行速度非常快:

package main

import (
"fmt"
"time"
)

func fib(n int) int {
if n < 2 {
return n
} else {
return fib(n-1) + fib(n-2)
}
}

func main() {
s := time.Now()
fmt.Println(fib(34))
d := time.Now().Sub(s)
fmt.Println("took", d)
}

$ go run fib.go
5702887
took 49.244697ms

(注意:上面是草率的:我们应该使用 int64,我只是懒惰)。

Python3变体:
import time
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)

s = time.time()
print(fib(34))
print(f"took {time.time() - s}s")

需要更长的时间:
$ python3 fib.py
5702887
took 2.1027958393096924s

作为 peterSO notes,递归算法进行了很多调用:
package main

import (
"fmt"
"time"
)

var calls int

func fib(n int) int {
calls += 1
if n < 2 {
return n
} else {
return fib(n-1) + fib(n-2)
}
}

func main() {
s := time.Now()
fmt.Println(fib(34))
d := time.Now().Sub(s)
fmt.Println("took", d, "to make", calls, "calls")
}

$ go run fib.go
5702887
took 53.328049ms to make 18454929 calls

(额外的几毫秒归因于通话次数)。因此,Go在大约50毫秒内运行了1,845万个调用,而Python在大约2.1 s内运行了相同的1,845万个调用。 Go每次调用花费约2.7 ns,Python每次调用花费约114毫秒。

关于go - 使用GC负责90%的CPU时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59524032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com