2012-04-26 14 views
10

मैं एक परियोजना (स्कैला में) पर काम कर रहा हूं, जहां मुझे कुछ बहुत बड़ी संख्या में हेरफेर करने की आवश्यकता है; अभिन्न प्रकारों द्वारा प्रतिनिधित्व करने के लिए बहुत बड़ा है। जावा BigInteger और BigDecimal कक्षाएं प्रदान करता है (और स्कैला उनके चारों ओर एक अच्छा पतला रैपर प्रदान करता है)। हालांकि, मैंने देखा कि ये पुस्तकालय अन्य मनमाने ढंग से सटीक पुस्तकालयों की तुलना में काफी धीमे हैं जो मैंने अतीत में उपयोग किया है (यानी http://www.ginac.de/CLN/), और गति अंतर अकेले भाषा को जिम्मेदार ठहराया जा सकता है उससे बड़ा लगता है।जेवीएम मनमानी प्रेसिजन पुस्तकालय

मैंने अपने कार्यक्रम की कुछ प्रोफाइलिंग की है, और 44% निष्पादन समय BigInteger गुणा विधि में खर्च किया जा रहा है। मैं अपने प्रोग्राम को थोड़ा तेज़ करना चाहता हूं, इसलिए मैं BigInteger क्लास (और इसके स्कैला रैपर) की तुलना में तेज़ और अधिक कुशल विकल्प ढूंढ रहा हूं। मैंने BigInteger (JScience से) और एंट (Afloat से) देखा है। हालांकि, मानक बिगइंटर वर्ग की तुलना में दोनों धीरे-धीरे प्रदर्शन करते हैं।

क्या किसी को उच्च प्रदर्शन पूर्णांक गुणा और अतिरिक्त पर ध्यान देने के साथ किसी जावा (या जेवीएम पर उपलब्ध) मनमाने ढंग से सटीक गणित पुस्तकालय के बारे में पता है?

+0

वहाँ एक कुछ अच्छे यहाँ http://stackoverflow.com/questions/277309/java-floating-point-high-precision-library अनुभव – thoredge

+0

धन्यवाद हो रहा है। हालांकि, मैंने इस सवाल को देखा है और दोनों जेएसआईंस और एफ़्लैट पुस्तकालयों (जो मैंने कहा है, बिगइंटर से धीमा प्रतीत होता है) की कोशिश की है। ऐसा इसलिए हो सकता है क्योंकि आकार (~ 1500 अंकों) के मामले में मेरी संख्याएं ट्वाइलाइट जोन में हैं। किसी भी तरह से, मुझे पता है कि ऑपरेशन बहुत तेज़ हो सकते हैं (क्योंकि सी ++ कोड ने इसे हासिल किया है)। भाषा अंतर के अलावा, उत्परिवर्तन (बनाम अपरिवर्तनीय जावा इम्प्लेक्स) भी खेल सकते हैं। – nomad

उत्तर

1

दुर्भाग्यवश, मुझे लगता है कि आप जावा मूल पुस्तकालय के लिए भाग्य से बाहर हैं। मुझे एक नहीं मिला है। मैं जीएमपी लपेटने की सलाह देता हूं, जिसमें जेएनआई का उपयोग करके उत्कृष्ट मनमाना सटीक प्रदर्शन है। जेएनआई ओवरहेड है, लेकिन यदि आप 1500 अंकों की रेंज में हैं, तो यह एल्गोरिदमिक जटिलता में अंतर की तुलना में छोटा होना चाहिए। आप जावा के लिए जीएमपी के विभिन्न लपेटें पा सकते हैं (मुझे विश्वास है कि सबसे लोकप्रिय एक here है)।

+0

धन्यवाद रेक्स। मैं यह जवाब स्वीकार करूंगा बी/सी यह ध्वनि लगता है। हालांकि, ऐसा लगता है कि बी/सी मैं इतनी बड़ी संख्या में बड़े पूर्णांक बना रहा हूं, जेएनआई ओवरहेड और जेवीएम/देशी ऑब्जेक्ट आवंटन वास्तव में मुझे यहां मार रहा है; जिसके परिणामस्वरूप जावा के BigInteger की तुलना में प्रदर्शन खराब हो गया। – nomad

+0

@nomad - आपको पूर्णांक का पुन: उपयोग करने की आवश्यकता है। जीएमपी ऐसा कर सकता है, और स्कैला आपको अपडेट-एंड-रिटर्न-बाएं हाथ-तर्क ऑपरेशन दे सकता है जो कुछ हद तक पुन: उपयोग की समस्या में मदद कर सकता है। "पिडिगिट्स" स्कैला प्रोग्राम देखें जो कंप्यूटर भाषा बेंचमार्क गेम में जीएमपी का उपयोग करने के विचार के लिए जीएमपी का उपयोग करता है। (मैं कोई दावा नहीं करता कि यह सबसे सुरुचिपूर्ण है, लेकिन यह कम से कम कुछ हद तक काम करने योग्य है।) –

2

मुझे थोड़ा देर हो चुकी है ... अच्छी तरह से मुझे केवल एफ़्लोएट लाइब्रेरी पता है, जो सी ++ और जावा दोनों में उपलब्ध है। Apfloat-Library:

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