簡體   English   中英

FizzBu​​zz程序似乎很慢:為什么?

[英]FizzBuzz program seems slow: why?

[ANSWER] Go不緩沖標准輸出。 切換到緩沖版本並手動刷新使其更接近您的預期。 避免fmt使其運行速度盡可能快。

我正在嘗試在Go中編寫FizzBu​​zz程序。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM