Я провел некоторое профилирование и получил следующие результаты (MSVS 2008, / O2, сборка релиза, запуск .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)
Это профилирование показывает, что вы должны использовать "нормальные" варианты контейнера вместо "multi", и вам следует выбрать 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);
}
}