2010-06-26 8 views
19

मुझे यकीन नहीं है कि यह स्टैक ओवरफ्लो या क्लोजर Google समूह में है या नहीं। लेकिन समूह numeric improvements for Clojure 1.2 पर चर्चा करने में व्यस्त प्रतीत होता है, इसलिए मैं यहां कोशिश करूंगा:क्लोजर संख्या क्रंचिंग प्रदर्शन

http://shootout.alioth.debian.org/ में विभिन्न भाषाओं के लिए कई प्रदर्शन मानक हैं।

मैंने देखा कि क्लोजर गुम था, इसलिए मैंने n-body problem का क्लोजर संस्करण बनाया।

सबसे तेजी से कोड मैं उत्पादन करने के लिए found here हो सकता है कर रहा था, और बेंचमार्किंग यह कह जा सकता है कि Clojure क्रंचिंग संख्या के लिए

  • कारक है लगता है ~ 10 जल्दी से अजगर/रूबी/पर्ल
  • कारक ~ 4 धीमी गति से सी/जावा/Scala/ऐडा
  • OCaml, Erlang के साथ बराबर के लगभग
  • और जाओ

मैं प्रदर्शन के उस स्तर काफी खुश हूं।

Clojure गुरु को मेरा प्रश्न है

  • , वहाँ स्पष्ट सुधार मैं चूक गए हैं या तो गति के मामले में या कोड संक्षिप्तता या पठनीयता के संदर्भ (गति का त्याग किए बिना) में?
  • क्या आप इसे एक तरफ क्लोजर प्रदर्शन बनाम पायथन/रूबी/पर्ल के प्रतिनिधि और दूसरे पर जावा/सी के प्रतिनिधि मानते हैं?

अद्यतन

अधिक Clojure 1.1 शूटआउट here के लिए बेंचमार्क कार्यक्रम, एन-शरीर समस्या भी शामिल है।

+0

मुझे कल्पना करना है कि जेवीएम यहां एक बड़ा हिस्सा खेलेंगे। आप किस जेवीएम का उपयोग कर रहे हैं? क्या आप शूटआउट के समान ही उपयोग कर रहे हैं? –

+0

जावा 1.6.0, मानक जावा जो ओएस एक्स 10.6 के साथ जहाजों। यह लगभग एक ही JVM है (मुझे: 1.6.0_20, शूटआउट: 1.6.0_18) लेकिन शूटआउट से अलग कंप्यूटर। मैं स्थानीय रूप से क्लोजर और शूटआउट जावा कार्यान्वयन दोनों चला गया। मैंने बेसलाइन के रूप में जावा का उपयोग करके और शूटआउट परिणामों के अनुसार स्केलिंग के सापेक्ष प्रदर्शन का अनुमान लगाया। –

+0

आपका कोड बहुत अच्छा लगता है। 1.2 में आदिम सुधार के साथ मैं आपको जावा समय के बहुत करीब पहुंचने में सक्षम होने की उम्मीद करता हूं। क्या आपने इसे प्रोफाइलर के माध्यम से चलाने की कोशिश की है? मेरा संदेह यह है कि कहीं कुछ मुक्केबाजी या फ़ंक्शन कॉल ओवरहेड जोड़ रहा है जो आपको चोट पहुंचा रहा है। – mikera

उत्तर

4

मुझे आश्चर्य है कि Cantor आपके लिए उपयोग किया जा सकता है - यह क्लोजर के लिए एक उच्च प्रदर्शन गणित पुस्तकालय है। Google समूह पर this thread भी देखें, जो कि नई आदिम अंकगणितीय सामग्री के संदर्भ में एक समान परियोजना के बारे में है।

+0

कैंटोर उपयोगी दिखता है, मुझे एक नज़र आएगी। धन्यवाद! –

11
नहीं

प्रतिक्रियाओं की बाढ़ यहाँ :) लेकिन जाहिरा तौर पर कुछ रुचि है, तो मैं क्या मैं पिछले कुछ दिनों में सीखा है के साथ अपने ही सवाल का जवाब देने की कोशिश करेंगे:

    1.1 अनुकूलन दृष्टिकोण के साथ
  • (जावा प्राइमेटिव्स और म्यूटेबल एरे) ऑप्टिमाइज्ड जावा की तुलना में ~ 4x धीमी गति से जितनी जल्दी हो जाती है।
  • 1.2 निर्माणों definterface और deftype, दो बार तेज रूप से अधिक कर रहे हैं 1.1 के लिए की तुलना में कम, सरल और क्लीनर कोड के साथ ~ 1.7x (+ 70%) जावा के भीतर आ रहा है।

यहाँ कार्यान्वयन हैं:

More details "सबक सीख लिया", JVM संस्करण और रूपरेखा स्क्रीनशॉट भी शामिल है।

विषयपरक रूप से बोलते हुए, 1.2 कोड को अनुकूलित करने के लिए 1.1 को अनुकूलित करने की तुलना में हवा थी, इसलिए क्लोजर संख्या क्रंचिंग के लिए यह बहुत अच्छी खबर है। (वास्तव में आश्चर्यजनक के करीब :)

1.2 परीक्षण वर्तमान मास्टर शाखा का उपयोग करता है, मैंने नई संख्यात्मक शाखाओं में से कोई भी कोशिश नहीं की। मैं क्या नए विचारों वर्तमान में चर्चा की जा रही

  • गैर अनुकूलित numerics तेजी से कर सकते हैं इकट्ठा कर सकते हैं से
  • इस बेंचमार्क
  • शायद 1.2 संस्करण में तेज़ी नहीं आएगी 1.1 संस्करण में तेजी लाने सकता है, यह है पहले से ही "धातु के करीब" के रूप में यह होने की संभावना है।

अस्वीकरण:

  • Clojure 1.2 अभी तक जारी नहीं किया गया है, तो 1.2 बेंचमार्क परिणाम प्रारंभिक रहे हैं।
  • यह भौतिकी गणनाओं पर एक विशेष बेंचमार्क है। यह फ़्लोटिंग पॉइंट नंबर क्रंचिंग के लिए प्रासंगिक है, लेकिन स्ट्रिंग पार्सिंग, कॉन्सुरेंसी या वेब अनुरोध हैंडलिंग जैसे क्षेत्रों में प्रदर्शन के लिए अप्रासंगिक है।
+1

आपको संख्यात्मक शाखाओं को आजमाएं, अपने कोड को देखकर मैं उन स्थानों को देख सकता हूं जहां आपको 1.2 मास्टर शाखा के तहत अनावश्यक रूप से मुक्केबाजी मिल जाएगी। – dnolen

+0

टिप के लिए धन्यवाद। इक्विव शाखा का 1.1 संस्करण पर कुछ प्रभाव पड़ा, 1.2 संस्करण के लिए कोई उल्लेखनीय अंतर नहीं था। वैकल्पिक कार्यान्वयन हो सकते हैं जहां अंतर अधिक महत्वपूर्ण है। इक्विव शाखा अभी भी अच्छी लगती है, खासकर आदिम प्रकार के संकेत और स्थिर। –

+0

आपके अत्यधिक रोचक योगदान के लिए बहुत बहुत धन्यवाद। मैं विशेष रूप से विस्तृत विश्लेषण पढ़ने का आनंद लिया। मैंने 1.2 संस्करण संकलित किया और इसे कई उदाहरणों में जावा उदाहरण के साथ तुलना की और यह औसतन 1.5x धीमी थी। मेरे हिस्से पर दो प्रश्न विकसित किए गए हैं। जैसा कि आपने अपने विश्लेषण में कहा है कि कोड मूर्खतापूर्ण नहीं है क्योंकि यह परिवर्तनीय चर का उपयोग करता है। अपरिवर्तनीय चर का उपयोग किए जाने पर कोड कितना धीमा होगा? उत्परिवर्तनीय या अपरिवर्तनीय संस्करण के समानांतर में कितना प्रयास शामिल होगा? –

4

यह एक थोड़ा पुराने सवाल है और मौजूदा जवाब कुछ हद तक पुराने हो चुके हैं, इसलिए मैं में रुचि रखने वालों "संख्या क्रंचिंग" Clojure

में

के लिए 2013 के मध्य के रूप में एक अद्यतन जोड़ना चाहते हैं क्लोजर न्यूमेरिकल कंप्यूटिंग स्पेस में बहुत कुछ हो रहा है:

  • क्लोजर 1.5 अब बाहर है, जिसमें संख्यात्मक संचालन के लिए बहुत अधिक उन्नत समर्थन है। ज्यादातर मामलों में, यह अब बहुत शुद्ध जावा गति के करीब प्राप्त करना संभव है
  • एक समर्पित समाचार समूह - Numerical Clojure
  • core.matrix अब कि (देशी BLAS पुस्तकालयों सहित) कई बैकएंड कार्यान्वयन
  • का समर्थन करता है मैट्रिक्स गणित के लिए एक मुहावरेदार एपीआई/संख्यात्मक कंप्यूटिंग प्रदान करता है

अस्वीकरण: मैं उपरोक्त में से कई को एक रखरखाव/योगदानकर्ता हूं।