String
जावा में सभी गैर-मुद्रण योग्य वर्णों को छीनने का सबसे तेज़ तरीका क्या है ?
अब तक मैंने 138-बाइट, 131-कैरेक्टर स्ट्रिंग पर कोशिश की है और मापा है:
- स्ट्रिंग की
replaceAll()
- सबसे धीमी विधि- 517009 परिणाम / सेकंड
- एक पैटर्न को रोकें, फिर मिलानकर्ता का उपयोग करें
replaceAll()
- 637836 परिणाम / सेकंड
- StringBuffer का उपयोग करें,
codepointAt()
एक-एक करके कोडपॉइंट प्राप्त करें और StringBuffer का उपयोग करें- 711946 परिणाम / सेकंड
- StringBuffer का उपयोग करें,
charAt()
एक-एक करके chars प्राप्त करें और StringBuffer का उपयोग करें- 1052964 परिणाम / सेकंड
- एक
char[]
बफर को प्रीचॉक करें ,charAt()
एक-एक करके चार्ट प्राप्त करें और इस बफर को भरें, फिर वापस स्ट्रिंग में परिवर्तित करें- 2022653 परिणाम / सेकंड
- Preallocate 2
char[]
बफ़र्स - पुराने और नए, एक ही समय में मौजूदा स्ट्रिंग के लिए सभी वर्ण प्राप्त करेंgetChars()
, एक- एक करके पुराने बफर पर पुनरावृति करें और नए बफर भरें, फिर नए बफर को स्ट्रिंग में बदलें - मेरा अपना सबसे तेज़ संस्करण- 2502502 परिणाम / सेकंड
- 2 बफ़र्स के साथ एक ही सामान - केवल उपयोग
byte[]
,getBytes()
और "utf-8" के रूप में एन्कोडिंग निर्दिष्ट करना- 857485 परिणाम / सेकंड
- 2
byte[]
बफ़र्स के साथ सामान , लेकिन एन्कोडिंग को एक स्थिर के रूप में निर्दिष्ट करनाCharset.forName("utf-8")
- 791076 परिणाम / सेकंड
- 2
byte[]
बफ़र्स के साथ समान सामान , लेकिन एन्कोडिंग को 1-बाइट स्थानीय एन्कोडिंग के रूप में निर्दिष्ट करना (बमुश्किल एक समझदार चीज़ है)- 370164 परिणाम / सेकंड
मेरी सबसे अच्छी कोशिश निम्नलिखित थी:
char[] oldChars = new char[s.length()];
s.getChars(0, s.length(), oldChars, 0);
char[] newChars = new char[s.length()];
int newLen = 0;
for (int j = 0; j < s.length(); j++) {
char ch = oldChars[j];
if (ch >= ' ') {
newChars[newLen] = ch;
newLen++;
}
}
s = new String(newChars, 0, newLen);
इसे और भी तेज़ बनाने के बारे में कोई विचार?
एक बहुत ही अजीब सवाल का जवाब देने के लिए बोनस अंक: "यूटीएफ -8" चारसेट नाम का उपयोग करके पूर्व-आवंटित स्टैटिक कॉस्ट का उपयोग करने से बेहतर प्रदर्शन सीधे Charset.forName("utf-8")
क्यों मिलता है?
अपडेट करें
- शाफ़्ट सनकी से सुझाव प्रभावशाली 3105590 परिणाम / सेकंड प्रदर्शन, एक + 24% सुधार!
- एड स्टाब से सुझाव अभी तक एक और सुधार - 3471017 परिणाम / सेकंड, पिछले सर्वश्रेष्ठ से अधिक 12%।
अपडेट २
मैंने सभी प्रस्तावित समाधानों और इसके क्रॉस-म्यूटेशन को इकट्ठा करने की पूरी कोशिश की है और इसे जीथब में एक छोटे बेंचमार्किंग फ्रेमवर्क के रूप में प्रकाशित किया है । वर्तमान में यह 17 एल्गोरिदम को स्पोर्ट करता है। उनमें से एक "विशेष" है - Voo1 एल्गोरिथ्म ( एसओ उपयोगकर्ता वू द्वारा प्रदान किया गया ) जटिल प्रतिबिंब चाल को नियोजित करता है जिससे तारकीय गति प्राप्त होती है, लेकिन यह जेवीएम स्ट्रिंग्स की स्थिति को गड़बड़ कर देता है, इस प्रकार इसे अलग से बेंचमार्क किया जाता है।
अपने बॉक्स पर परिणाम निर्धारित करने के लिए इसका स्वागत करते हैं और इसे चलाने के लिए आपका स्वागत है। यहां मेरे द्वारा प्राप्त किए गए परिणामों का सारांश है। यह चश्मा है:
- डेबियन का किनारा
- लिनक्स 2.6.39-2-amd64 (x86_64)
- एक पैकेज से स्थापित जावा
sun-java6-jdk-6.24-1
, जेवीएम खुद की पहचान करता है- जावा (TM) एसई रनटाइम एनवायरनमेंट (बिल्ड 1.6.0_24-b07)
- जावा हॉटस्पॉट (टीएम) 64-बिट सर्वर वीएम (19.1-b02, मिश्रित मोड का निर्माण)
अलग-अलग एल्गोरिदम अंततः इनपुट डेटा के एक अलग सेट को देखते हुए अलग-अलग परिणाम दिखाते हैं। मैंने 3 मोड में एक बेंचमार्क चलाया है:
एक ही तार
यह मोड StringSource
एक स्थिर के रूप में वर्ग द्वारा प्रदान की गई एक ही स्ट्रिंग पर काम करता है। तसलीम है:
ऑप्स / एस / एल्गोरिथम ──────────┼────────────────────────────── 6 535 947 1 Voo1 ──────────┼────────────────────────────── ५ ३५० ४५४ c रत्चेफ्रीके २ इदसताब १ ग्रेगेट १ 5 249 343 S EdStaub1 5 002 501 S EdStaub1GreyCat1 4 859 086 ray ArrayOfCharFromStringCharAt 4 295 532 c शाफ़्टफ़्रेक 1 4 045 307 │ ArrayOfCharFromArrayOfChar 2 790 178 790 रत्चेफ्रीके 2 ईडसटब 1 ग्रेकैट 2 २ ५ 2३ ३११ 3 रत्चेफ्रीके २ १ २ 1४ har५ ९ 4 स्ट्रिंगब्रुलेचर 1 138 174 ring StringBuilderCodePoint 994 727 ray ArrayOfByteUTF8String 918 611 O ArrayOfByteUTF8Const 756 086 0 माचिसरैल 598 945 8 StringReplaceAll 460 045 0 ArrayOfByteWindows1251
चार्टेड रूप में:
(स्रोत: greycat.ru )
एकाधिक तार, 100% तार में नियंत्रण वर्ण होते हैं
स्रोत स्ट्रिंग प्रदाता ने (0..127) वर्ण सेट का उपयोग करते हुए बहुत सारे यादृच्छिक तार उत्पन्न किए - इस प्रकार लगभग सभी तारों में कम से कम एक नियंत्रण वर्ण होता है। राउंड-रॉबिन फैशन में इस पूर्व-निर्मित सरणी से एल्गोरिदम को तार मिले।
ऑप्स / एस / एल्गोरिथम ──────────┼────────────────────────────── 2 123 142 2 Voo1 ──────────┼────────────────────────────── 1 782 214 21 EdStaub1 1 776 199 S EdStaub1GreyCat1 1 694 628 ray ArrayOfCharFromStringCharAt 1 481 481 ray ArrayOfCharFromArrayOfChar १ ४६० ०६│ c रत्चेफ्रीके २ ईडसटब १ ग्रेगेट १ १ ४३ 1 ४३५ c रत्चेफ्रीके २ ईदसताब १ ग्रेगेट २ 1 366 494 49 शाफ़्टफ़्रेक 2 १ ३४ ९ .१० 7 रत्चेफ्रीके १ 893 176 8 ArrayOfByteUTF8String 817 127 17 ArrayOfByteUTF8Const 778 089 B StringBuilderChar 734 754 B StringBuilderCodePoint 377 829 O ArrayOfByteWindows1251 224 140 4 माचिस की दर 211 104 1 StringReplaceAll
चार्टेड रूप में:
(स्रोत: greycat.ru )
एकाधिक स्ट्रिंग्स, स्ट्रिंग्स के 1% में नियंत्रण वर्ण होते हैं
पिछले की तरह ही, लेकिन नियंत्रण पात्रों के साथ केवल 1% तार उत्पन्न हुए थे - अन्य 99% [32..127] वर्ण सेट का उपयोग करके उत्पन्न किया गया था, इसलिए वे नियंत्रण वर्णों को शामिल नहीं कर सकते थे। यह सिंथेटिक लोड मेरे स्थान पर इस एल्गोरिथ्म के वास्तविक विश्व अनुप्रयोग के सबसे करीब आता है।
ऑप्स / एस / एल्गोरिथम ──────────┼────────────────────────────── 3 711 952 oo Voo1 ──────────┼────────────────────────────── 2 851 440 S EdStaub1GreyCat1 2 455 796 S EdStaub1 2 426 007 O ArrayOfCharFromStringCharAt 2 347 969 c रत्चेफ्रीके 2 ईडसटब 1 ग्रेयकट 2 २ २४२ १५२ c रत्चेफ्रीके १ 2 171 553 ray ArrayOfCharFromArrayOfChar १ ९ २२ E०E c रत्चेफ्रीक २ ईडसटब १ ग्रेगेट १ 1 857 010 0 शाफ़्टफ़्रेक 2 1 023 751 ray ArrayOfByteUTF8String 939 055 B स्ट्रिंगबर्लचर 907 194 O ArrayOfByteUTF8Const 841 963 B StringBuilderCodePoint 606 465 6 माचिस की दर 501 555 55 StringReplaceAll 381 185 O ArrayOfByteWindows1251
चार्टेड रूप में:
(स्रोत: greycat.ru )
मेरे लिए यह तय करना बहुत कठिन है कि सबसे अच्छा उत्तर किसने दिया, लेकिन वास्तविक दुनिया के लिए सबसे अच्छा समाधान एड स्टब द्वारा दिया गया / प्रेरित था, मुझे लगता है कि उनके उत्तर को चिह्नित करना उचित होगा। इसमें भाग लेने वाले सभी लोगों के लिए धन्यवाद, आपका इनपुट बहुत मददगार और अमूल्य था। अपने बॉक्स पर परीक्षण सूट चलाने के लिए स्वतंत्र महसूस करें और बेहतर समाधानों का प्रस्ताव रखें (जेएनआई समाधान, किसी को भी काम कर रहे हैं?)।
संदर्भ
- एक बेंचमार्किंग सूट के साथ GitHub रिपॉजिटरी