में लिखे गए एक फैक्टोरियल फ़ंक्शन का कम प्रदर्शन मैं क्लोजर के लिए नया हूं। इसके प्रयोग में मैंने लिखा है कि मैं n!
की गणना करने के लिए कार्य करता हूं। मेरा क्लोजर कोड निम्नानुसार है:क्लोजर
(defn factorial
[n]
(reduce * (biginteger 1) (range 1 (inc n))))
फिर मैंने एक प्रतिलिपि में निम्नलिखित भाग लिया।
(time (factorial 100))
और यह परिणाम था:
"Elapsed time: 0.50832 msecs"
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000N
मैं तो रूबी में एक ऐसी ही समाधान बनाया:
It took: 0.06556510925292969 msecs
=> 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
:
def factorial(n)
start = Time.now.to_f
(2..n).inject(1) { |p, f| p * f }
finish = Time.now.to_f
time_taken = finish - start
puts "It took: #{(time_taken * 1000)} msecs"
end
आईआरबी मैं factorial(100)
भाग गया जिसके परिणामस्वरूप
रूबी संस्करण का प्रदर्शन काफी अधिक प्रतीत होता है, हालांकि मैंने देखा है कि क्लोजर में बेहतर प्रदर्शन होना चाहिए। क्या मुझे कुछ गलतफहमी है या मेरे क्लोजर समाधान का कुछ तत्व है जो इसे धीमा कर देगा?
उपयोग करने का प्रयास को बढ़ावा देंगे '' बजाय biginteger' की bigint'। – ndn
हाँ, जिसने बिगिनमेंट का काम किया, निष्पादन को बहुत तेज बना दिया। –
इस बेंचमार्क में 'टाइम' का उपयोग करना गंभीर रूप से भ्रामक है क्योंकि JVM "warms up" फ़ंक्शन कैसे करता है। क्लोजर उदाहरण वास्तव में रूबी की तुलना में * अधिक * तेज है, बशर्ते आप जावा प्लेटफ़ॉर्म डिज़ाइनर को "तेज़" की परिभाषा स्वीकार करें, "संकलित होने के लिए पर्याप्त गर्म हो जाने के बाद" –