2013-03-14 3 views
6

संकलित करने के लिए बहुत लंबा समय लेते हैं C++ में लिखे गए एक प्रोग्राम के लिए, मुझे स्ट्रिंग के दो विशाल सरणी की आवश्यकता होती है जिसमें डेटा होता है।सी ++ (जीसीसी/जी ++) तारों के दो विशाल सरणी

वे एक हेडर फाइल में इस प्रकार परिभाषित कर रहे हैं:

#include <string> 
static const string strdataA[30000]={"this is the first line of the data", 
    "the second line of data", 
    "other stuff in the third line", 

नीचे

"last line."}; 

करने के लिए नीचे करने के लिए

"last line."}; 
//second array strings 
static const string strdataB[60000]={"this is the first line of the data", 
    "the second line of data", 
    "other stuff in the third line", 

लेकिन जब मैं जी के साथ इस संकलन ++, यह बहुत लेता है लंबे समय तक मैंने इसे पूरा नहीं देखा है। यह लगभग दो जीबी वर्चुअल मेमोरी का भी उपयोग करता है। तो मैंने strdataB [] पर टिप्पणी की, और फिर कार्यक्रम संकलित किया, लेकिन अभी भी लंबे समय के बाद। निष्पादन योग्य केवल 8 एमबी था और ठीक काम किया।

संकलन प्रक्रिया को तेज़ करने के लिए मैं क्या कर सकता हूं? मुझे कोई फर्क नहीं पड़ता कि मुझे कोड बदलना है, लेकिन मैं लोड करने के लिए बाहरी फाइल का उपयोग नहीं करना चाहता हूं। मुझे एक सरणी चाहिए क्योंकि यह प्रोग्राम के अंदर मेरे लिए बेहद अच्छा काम करता है।

मैंने नेट पर कहीं भी पढ़ा है कि "स्थिर कॉन्स" को चाल चलनी चाहिए, लेकिन मुझे अनुभव से पता चला कि यह नहीं है।

किसी भी सुझाव के लिए अग्रिम धन्यवाद!

+0

आप कितने लाइनों के बारे में बात कर रहे हैं? क्या आपके स्रोत में वास्तव में 30,000 और 60,000 तार हैं? –

+1

मुझे लगता है कि वे एक स्रोत फ़ाइल में हैं जो हेडर फ़ाइल नहीं है। –

+0

आपको एहसास है कि लोडर को मूल रूप से वही करना है जैसा आप करेंगे यदि आपने बाहरी फाइल से तारों को लोड किया है? –

उत्तर

6

इसके लिए आपको std::string का उपयोग नहीं करना चाहिए। बजाय सादे पुराने const char* का उपयोग करें:

const char * const strdataA[30000] = { 
    "one", 
    "two", 
    //... 
}; 

static कीवर्ड एक अंतर यहाँ के ज्यादा नहीं होना चाहिए।

इस तरह, स्ट्रिंग स्वयं को केवल पढ़ने वाले डेटा अनुभाग में सरल अक्षर के रूप में संग्रहीत किया जाएगा, और सरणी केवल पॉइंटर्स की एक सरणी होगी। साथ ही, आप रनटाइम पर स्ट्रिंग कन्स्ट्रक्टर/विनाशकों को चलाने से बचें।

+0

यह वास्तव में चाल है, अब यह आंखों के झपकी में संकलित है। धन्यवाद! –

3

मुझे विश्वास है कि ये जीसीसी में ज्ञात मुद्दे हैं। आप यह नहीं कहते कि जीसीसी का कौन सा संस्करण आप उपयोग कर रहे हैं, शायद आपको जीसीसी की नवीनतम स्थिर रिलीज के साथ प्रयास करना चाहिए, यह देखने के लिए कि क्या यह चीजों में सुधार करता है या नहीं करता है।

आपको शायद अपनी सभी स्ट्रिंग को स्रोत कोड में नहीं रखना चाहिए। आपको उन्हें स्टार्टअप या ऐसे में बाहरी फ़ाइल से लोड करना चाहिए।

+0

सहमत है, तारों को बाहरी और स्टार्टअप पर लोड करके प्रोग्राम को संशोधित करना बहुत आसान है । स्ट्रिंग में टाइपो को ठीक करने के लिए इसे कोड संशोधन की आवश्यकता होती है। –

+0

@ क्रिस। सॉवर सामान्य रूप से, मैं आप दोनों से सहमत हूं। हालांकि, उदाहरण के लिए यदि आप अपने स्रोत कोड में अपनी कॉन्फ़िगरेशन फ़ाइल की स्कीमा संग्रहीत कर रहे हैं, तो मुझे लगता है कि सुरक्षा कारणों के लिए यह एक अच्छा विचार था। –

+0

जीसीसी - वर्जन "जीसीसी (उबंटू/लिनारो 4.7.2-11 ल्यूसिड 3) 4.7.2" देता है, जो नवीनतम मैं प्राप्त कर सकता हूं। बाहरी डेटा फाइल/डेटाबेस एक समाधान हो सकता है, लेकिन मैं सिर्फ एक ही निष्पादन योग्य चाहता हूं, कई अलग-अलग फाइलें नहीं। –

1

संकलन प्रक्रिया को तेज़ करने के लिए मैं क्या कर सकता हूं?

const char* strdataA ... संकलन प्रक्रिया को तेज करना चाहिए। क्योंकि आपके वर्तमान संस्करण g ++ में प्रत्येक स्ट्रिंग के लिए कन्स्ट्रक्टर कॉल की विशाल सूची बनाना चाहिए।

+0

धन्यवाद, यह वास्तव में समाधान है। –

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