2014-10-01 8 views
7

[उत्तर] जाओ stdout बफ़र नहीं होता। एक बफर किए गए संस्करण पर स्विच करना और मैन्युअल रूप से फ़्लश करना आपको इसकी अपेक्षा के करीब लाता है। एफएमटी से बचने से आप जितनी जल्दी चाहें उतनी तेजी से दौड़ सकते हैं।FizzBuzz प्रोग्राम धीमा लगता है: क्यों?

मैं जाओ में 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% समय एफएमटी (* एफएमटी) .fmt_complex में बिताया जाता है, जिसे मैं अनुमान लगा रहा हूं Println (?) से संबंधित है। इसके अलावा strconv.Itoa बजाय fmt.Sprint के साथ कार्यक्रम की कोशिश की और मैं मामूली प्रदर्शन वृद्धि (~ 0.2s), लेकिन एक ही मूल परिणाम प्राप्त।

यह मुद्रण है कि धीमी है और यदि ऐसा है तो क्यों है?

[संपादित करें]

jgritty बराबर अजगर कार्यक्रम और समय के लिए

। मुझे दिलचस्पी है कि प्रिंटिंग धीमी क्यों है? उन दृश्यों के पीछे कुछ कर रहा हूं जिनके बारे में मुझे पता नहीं है?

$ 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 
+0

http://blog.golang.org/profiling-go-programs –

+0

ध्यान दें कि हास्केल एक आलसी भाषा है; यह संभवतः आपके परिणामों का मूल्यांकन नहीं कर रहा है जब तक कि आप वास्तव में आउटपुट के लिए नहीं पूछते। जंग की सबसे अधिक संभावना है। –

+0

शायद उन अन्य भाषाओं की तुलना में शुरू होने में अधिक समय लगता है? क्या होगा यदि आपने प्रोग्राम प्रक्रिया को अधिक डेटा बनाने का प्रयास किया है तो इसे चलाने में लगभग 10 सेकंड लगते हैं? –

उत्तर

7

मानक आउटपुट पायथन और सी में buffered है, लेकिन जाओ नहीं। सेब की तुलना में एक सेब के लिए उत्पादन बफर। यह लगभग मेरे लैपटॉप पर आधा समय कटौती।

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 के उपयोग को समाप्त:

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

मुझे लगता है कि आप println के बजाय fmt.Fprintln का मतलब है। – Joseph

+0

ऐसा लगता है कि मुझे एक बड़ा प्रदर्शन सुधार मिलता है! चार गुना तेज, और हम एक सेकंड की एक चौथाई तक नीचे हैं। – Joseph

+2

दिलचस्प है कि गो ने डिफ़ॉल्ट रूप से stdout बफर न करने का निर्णय लिया: तर्क क्या है? – Joseph

संबंधित मुद्दे