फारो के निष्पादन मॉडल में कोई रहस्य नहीं है। पुनरावर्ती टुकड़ा
^ self * (self - 1) factorial
कि दूसरी ifTrue:
अंदर होता है bytecodes की निम्न क्रम को संकलित करता है:
39 <70> self ; receiver of outer message *
40 <70> self ; receiver of inner message -
41 <76> pushConstant: 1 ; argument of self - 1
42 <B1> send: - ; subtract
43 <D0> send: factorial ; send factorial (nothing special here!)
44 <B8> send: * ; multiply
45 <7C> returnTop ; return
ध्यान दें कि लाइन में 43 विशेष कुछ नहीं होता। कोड सिर्फ factorial
भेजता है वैसे ही, चयनकर्ता कोई अन्य था। विशेष रूप से हम देख सकते हैं कि यहां ढेर का कोई विशेष हेरफेर नहीं है।
इसका मतलब यह नहीं है कि अंतर्निहित देशी कोड में अनुकूलन नहीं हो सकते हैं। लेकिन यह एक अलग चर्चा है। यह निष्पादन मॉडल प्रोग्रामर के लिए महत्वपूर्ण है क्योंकि बाइटकोड के नीचे कोई भी अनुकूलन इस मॉडल को वैचारिक स्तर पर समर्थन देने के लिए है।
अद्यतन
दिलचस्प है, गैर पुनरावर्ती संस्करण
factorial2
| f |
f := 1.
2 to: self do: [:i | f := f * i].
^f
एक छोटा सा धीमी है कि पुनरावर्ती एक (Pharo)। कारण यह होना चाहिए कि बढ़ते i
से जुड़े ओवरहेड रिकर्सिव प्रेषण तंत्र से थोड़ा अधिक है।
यहाँ भाव मैंने कोशिश कर रहे हैं:
[25000 factorial] timeToRun
[25000 factorial2] timeToRun
स्रोत
2016-05-07 15:51:04
आप _could_ केवल पहले 'ifTrue:' मामले में ब्रेकपॉइंट डालते हैं और केवल उसी विधि को गिनती करते हैं जो स्टैक पर है ... ;-) –