[英]FizzBuzz program seems slow: why?
[ANSWER] Go不緩沖標准輸出。 切換到緩沖版本並手動刷新使其更接近您的預期。 避免fmt使其運行速度盡可能快。
我正在嘗試在Go中編寫FizzBuzz程序。
func main() {
for i := 1; i <= 1000000; i++ {
fmt.Println(fizzbuzz(i))
}
}
func fizzbuzz(n int) string {
fizzy := n%3 == 0
buzzy := n%5 == 0
switch {
case fizzy && buzzy:
return "FizzBuzz"
case fizzy:
return "Fizz"
case buzzy:
return "Buzz"
default:
return fmt.Sprint(n)
}
}
當我為1到100萬的數字運行時,只需不到一秒鍾即可完成。 當我用C,Rust,Haskell或Python編寫等效程序時,它需要從半秒(Python)到零秒(Rust和Haskell)。
這是預期的,還是我錯過了一些Go-fu? 為什么go似乎比其他語言慢?
[編輯]
按照Robert Harvey的建議運行探查器。
看起來100%的時間花在了fmt。(* fmt).fmt_complex上,我猜這與Println(?)有關。 還嘗試使用strconv.Itoa而不是fmt.Sprint的程序,我獲得了輕微的性能提升(~0.2s),但基本結果相同。
印刷是否緩慢,如果是這樣,為什么?
[編輯]
對於jgritty等效的Python程序和時序。 我對打印速度慢的原因感興趣? 我不知道幕后做些什么嗎?
$ cat fizzbuzz.py
def fizzbuzz(n):
fizzy = n%3 == 0
buzzy = n%5 == 0
if fizzy and buzzy:
return "FizzBuzz"
elif fizzy:
return "Fizz"
elif buzzy:
return "Buzz"
else:
return ("%u" % n)
def main():
for i in range(1, 10**6):
print(fizzbuzz(i))
main()
$ time pypy3 fizzbuzz.py >/dev/null
real 0m0.579s
user 0m0.545s
sys 0m0.030s
標准輸出在Python和C中緩沖,但不是Go。 緩沖輸出以進行蘋果對蘋果的比較。 這幾乎減少了我筆記本電腦上的時間。
import (
"bufio"
"fmt"
"os"
)
func main() {
w := bufio.NewWriter(os.Stdout)
for i := 1; i <= 1000000; i++ {
fmt.Fprintln(w, fizzbuzz(i))
}
w.Flush()
}
消除使用fmt軟件包進行另一項改進:
package main
import (
"bufio"
"os"
"strconv"
)
func main() {
w := bufio.NewWriter(os.Stdout)
for i := 1; i <= 1000000; i++ {
w.WriteString(fizzbuzz(i))
w.WriteString("\n")
}
w.Flush()
}
func fizzbuzz(n int) string {
fizzy := n%3 == 0
buzzy := n%5 == 0
switch {
case fizzy && buzzy:
return "FizzBuzz"
case fizzy:
return "Fizz"
case buzzy:
return "Buzz"
default:
return strconv.Itoa(n)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.