2011-11-25 13 views
5


मुझे यह कुछ कोड मिला जो मैं अनुकूलित करना चाहता था। यहाँ snipet है:क्या यह एक सामान्य जावा रेगेक्स व्यवहार है?

tempString = bigBuffer.replaceAll("\\n", ""); 
tempString = tempString.replaceAll("\\t", ""); 

तब मैं बुद्धिमानी regex का उपयोग करने का फैसला किया है और मैं इस किया था:

tempString = bigBuffer.replaceAll("[\\n\\t]", ""); 

फिर एक दोस्त ने मुझे बजाय यह करने के लिए कहा था:

tempString = bigBuffer.replaceAll("\\n|\\t", ""); 

चूंकि मैं अपने परिवर्तनों के परिणाम जानना चाहता हूं, इसलिए मैंने यह सत्यापित करने के लिए एक परीक्षण किया था कि यह एक अच्छा अनुकूलन था या नहीं। तो, परिणाम (जावा संस्करण "1.6.0_27") के साथ परिणाम पहला कोड संदर्भ 100% है।

पाइप के साथ यह 121% है इसलिए कार्य करने में अधिक समय लगा।

वर्ग ब्रैकेट के साथ यह 52% है इसलिए कार्य करने में कम समय लगता है।

रेगेक्स अलग तरीके से व्यवहार क्यों करता है जहां यह वही होना चाहिए?

मार्टिन

+0

यह वही क्यों होना चाहिए? – BoltClock

+0

मेरा मानना ​​है कि यह वही होना चाहिए क्योंकि यह वही काम करता है। हो सकता है कि संकलक को एक अनुकूलन की आवश्यकता हो जब पाइप का उपयोग एकल चरित्र के साथ किया जाता है। – Martin

उत्तर

4

पहले कोड स्निपेट दो बार bigBuffer के माध्यम से लग रहा है, पहली बार नई लाइनों की जगह है, और दूसरी बार टैब बदल देता है।

दूसरा कोड स्निपेट केवल एक बार BigBuffer के माध्यम से खोज करेगा, यह देखने के लिए कि प्रत्येक वर्ण एक या दूसरे है या नहीं। इसके परिणामस्वरूप केवल आधे समय में गति खत्म हो जाएगी।

तीसरे स्थान पर कोड स्निपेट शायद खराब रूप से संकलित किया गया है, और इसके परिणामस्वरूप पहले कोड के एल्गोरिदम का विशेष रूप से खराब संस्करण होता है, हालांकि मैं रेगेक्स संकलन के माध्यम से पथ की जांच किए बिना निश्चित रूप से नहीं कह सकता था।

हालांकि परीक्षण पर उत्कृष्ट काम। सापेक्ष समय (प्रतिशत-आधारित) उपयोगी है, पूर्ण समय (मिलीसेकंद या कुछ ऐसा) नहीं है।

2

आम तौर पर, एक वर्ण वर्ग ([abc]) बराबर विकल्प (a|b|c) से अधिक कुशल होता है, इसलिए मुझे नहीं पता कि आपका मित्र इसका सुझाव क्यों देगा। लेकिन जावा में, वर्ण वर्ग जो लैटिन 1 रेपरोटेयर (यानी पहले 256 यूनिकोड कोड पॉइंट) से केवल वर्णों से मेल खाते हैं, उन्हें और अनुकूलित किया जाता है। शायद यही कारण है कि आप दूसरी और तीसरी तकनीकों के बीच इतना बड़ा अंतर क्यों देख रहे हैं।

फिर, यह सिर्फ जावा में है। पर्ल में, मैं अपेक्षा करता हूं कि वैकल्पिकता और चरित्र वर्ग के बीच अंतर नगण्य हो, यह एक बहुत अधिक परिपक्व कार्यान्वयन है। और grep में शायद अंतर को मापना मुश्किल होगा चाहे आप तीनों तरीकों का उपयोग न करें - यह बस तेज़ है।

लेकिन अंगूठे के नियम के रूप में, यदि आपके पास चरित्र वर्ग या वैकल्पिकता का उपयोग करने के बीच कोई विकल्प है, तो आपको चरित्र वर्ग को प्राथमिकता देना चाहिए। यह तेज़ नहीं हो सकता है, लेकिन यह निश्चित रूप से धीमा नहीं होगा। और अनुचित रूप से इस्तेमाल किया, विकल्प प्रदर्शन पर एक विनाशकारी प्रभाव हो सकता है।

+0

अंगूठे के नियम के लिए धन्यवाद, मैं सुनिश्चित करूँगा कि मेरे दोस्त को इसके बारे में पता है। – Martin

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