मैंने कुछ प्रोफाइलिंग किया और निम्नलिखित परिणाम प्राप्त किए (एमएसवीएस 2008,/ओ 2, रिलीज बिल्ड, लॉन्चिंग .exe अलग से)।
संपादित करें - अब मुझे एहसास है कि मैं वास्तव में अपने पहले टेस्ट को सीकेड कर चुका हूं, क्योंकि मैंने इमारत और खोज परीक्षण को विभाजित नहीं किया था। हालांकि यह "विजेताओं" को नहीं बदला, मैंने कुछ नए परीक्षण किए। तो, जब हम उन्हें विभाजित करते हैं तो परिणाम यहां दिए गए हैं।
सबसे पहले, अगर लगभग कोई बुरा खोज अनुरोध (4 मिलियन अच्छे खोज प्रयास) हैं।
[ RUN ] Containers.DictionaryPrepare
[ OK ] Containers.DictionaryPrepare (234 ms)
[ RUN ] Containers.VectorPrepare
[ OK ] Containers.VectorPrepare (704 ms)
[ RUN ] Containers.SetPrepare
[ OK ] Containers.SetPrepare (593 ms)
[ RUN ] Containers.MultisetPrepare
[ OK ] Containers.MultisetPrepare (578 ms)
[ RUN ] Containers.UnorderedSetPrepare
[ OK ] Containers.UnorderedSetPrepare (266 ms)
[ RUN ] Containers.UnorderedMultisetPrepare
[ OK ] Containers.UnorderedMultisetPrepare (375 ms)
[ RUN ] Containers.VectorSearch
[ OK ] Containers.VectorSearch (4484 ms)
[ RUN ] Containers.SetSearch
[ OK ] Containers.SetSearch (5469 ms)
[ RUN ] Containers.MultisetSearch
[ OK ] Containers.MultisetSearch (5485 ms)
[ RUN ] Containers.UnorderedSet
[ OK ] Containers.UnorderedSet (1078 ms)
[ RUN ] Containers.UnorderedMultiset
[ OK ] Containers.UnorderedMultiset (1250 ms)
[----------] 11 tests from Containers (20516 ms total)
इस रूपरेखा से पता चलता है कि आप के बजाय "बहु" "सामान्य" कंटेनर रूपों का उपयोग करना चाहिए, और आप unordered_set
चयन करना चाहिए। समय और खोज संचालन के समय में यह बहुत अच्छा है।
यहाँ एक और मामले (लगता है कि इसे अपने ऐप्लिकेशन के बारे में नहीं है, लेकिन सिर्फ यह होने के लिए), जब बुरा खोजों की राशि अच्छा खोजें की राशि के बराबर होती है (और 2 लाख के बराबर होती है) के लिए परिणाम हैं। विजेता वही रहता है।
यह भी ध्यान रखें, कि स्थिर शब्दकोशों के लिए vector
बेहतर प्रदर्शन करती है (हालांकि प्रारंभ के लिए अधिक समय की आवश्यकता), set
से है, लेकिन अच्छी तरह से, यह आप तत्वों को जोड़ने के लिए है, तो चूसना होगा।
[ RUN ] Containers.DictionaryPrepare
[ OK ] Containers.DictionaryPrepare (235 ms)
[ RUN ] Containers.VectorPrepare
[ OK ] Containers.VectorPrepare (718 ms)
[ RUN ] Containers.SetPrepare
[ OK ] Containers.SetPrepare (578 ms)
[ RUN ] Containers.MultisetPrepare
[ OK ] Containers.MultisetPrepare (579 ms)
[ RUN ] Containers.UnorderedSetPrepare
[ OK ] Containers.UnorderedSetPrepare (265 ms)
[ RUN ] Containers.UnorderedMultisetPrepare
[ OK ] Containers.UnorderedMultisetPrepare (375 ms)
[ RUN ] Containers.VectorSearch
[ OK ] Containers.VectorSearch (3375 ms)
[ RUN ] Containers.SetSearch
[ OK ] Containers.SetSearch (3656 ms)
[ RUN ] Containers.MultisetSearch
[ OK ] Containers.MultisetSearch (3766 ms)
[ RUN ] Containers.UnorderedSet
[ OK ] Containers.UnorderedSet (875 ms)
[ RUN ] Containers.UnorderedMultiset
[ OK ] Containers.UnorderedMultiset (1016 ms)
[----------] 11 tests from Containers (15438 ms total)
परीक्षण कोड:
TEST(Containers, DictionaryPrepare) {
EXPECT_FALSE(strings_initialized);
for (size_t i = 0; i < TOTAL_ELEMENTS; ++i) {
strings.push_back(generate_string());
}
}
TEST(Containers, VectorPrepare) {
for (size_t i = 0; i < TOTAL_ELEMENTS; ++i) {
vec.push_back(strings[i]);
}
sort(vec.begin(), vec.end());
}
TEST(Containers, SetPrepare) {
for (size_t i = 0; i < TOTAL_ELEMENTS; ++i) {
set.insert(strings[i]);
}
}
TEST(Containers, MultisetPrepare) {
for (size_t i = 0; i < TOTAL_ELEMENTS; ++i) {
multiset.insert(strings[i]);
}
}
TEST(Containers, UnorderedSetPrepare) {
for (size_t i = 0; i < TOTAL_ELEMENTS; ++i) {
uo_set.insert(strings[i]);
}
}
TEST(Containers, UnorderedMultisetPrepare) {
for (size_t i = 0; i < TOTAL_ELEMENTS; ++i) {
uo_multiset.insert(strings[i]);
}
}
TEST(Containers, VectorSearch) {
for (size_t i = 0; i < TOTAL_SEARCHES; ++i) {
std::binary_search(vec.begin(), vec.end(), strings[rand() % TOTAL_ELEMENTS]);
}
for (size_t i = 0; i < TOTAL_BAD_SEARCHES; ++i) {
std::binary_search(vec.begin(), vec.end(), NONEXISTENT_ELEMENT);
}
}
TEST(Containers, SetSearch) {
for (size_t i = 0; i < TOTAL_SEARCHES; ++i) {
set.find(strings[rand() % TOTAL_ELEMENTS]);
}
for (size_t i = 0; i < TOTAL_BAD_SEARCHES; ++i) {
set.find(NONEXISTENT_ELEMENT);
}
}
TEST(Containers, MultisetSearch) {
for (size_t i = 0; i < TOTAL_SEARCHES; ++i) {
multiset.find(strings[rand() % TOTAL_ELEMENTS]);
}
for (size_t i = 0; i < TOTAL_BAD_SEARCHES; ++i) {
multiset.find(NONEXISTENT_ELEMENT);
}
}
TEST(Containers, UnorderedSet) {
for (size_t i = 0; i < TOTAL_SEARCHES; ++i) {
uo_set.find(strings[rand() % TOTAL_ELEMENTS]);
}
for (size_t i = 0; i < TOTAL_BAD_SEARCHES; ++i) {
uo_set.find(NONEXISTENT_ELEMENT);
}
}
TEST(Containers, UnorderedMultiset) {
for (size_t i = 0; i < TOTAL_SEARCHES; ++i) {
uo_multiset.find(strings[rand() % TOTAL_ELEMENTS]);
}
for (size_t i = 0; i < TOTAL_BAD_SEARCHES; ++i) {
uo_multiset.find(NONEXISTENT_ELEMENT);
}
}
ए * क्रमबद्ध * 'वेक्टर 'खोजना आम तौर पर आसान है। लेकिन वैध शब्द खोजने के लिए आपका क्या मतलब है? बस एक शब्द शब्दकोष में परीक्षण कर रहा है? –
UncleBens
हां। जब कोई उपयोगकर्ता एक शब्द इनपुट करता है, तो मुझे यह जांचना होगा कि क्या शब्द शब्दकोष में है या नहीं। –
शब्दों के वितरण के आधार पर 400K शब्द बहुत बड़े नहीं होते हैं, 'unordered_set' कंटेनर (जैसा कि नए सी ++ कार्यान्वयन या बूस्ट में) आदर्श होना चाहिए (लगभग ओ (1))। –