По воле рока, так случилось, иль MFC CMap vs STL std::map и stdext::hash_map
На работе в проекте используется MFC, причем везде и много. При запуске иногда программа серьйозно притормаживает. Натравить профайлер не могу, BoundChecker просто загнулся, а остальные я не пробовал, т.к руководству это не нужно и, соответственно, времени отпрофайлить мне никто не даст. Так вот, найдя проблемный участок кода, я обнаружил, что там происходит вставка элементов в CMap (класс MFC реализованный с помощью хеш-массива ) , причем при увеличении кол-ва элементов, время на вставку возростало. Попрошу извинить меня за предложения типа "при увеличении кол-ва элементов, время на вставку возростало" , из отсутствия профайлера я более точно сказать не могу, в проекте все замерял на глаз. Но эти наблюдения сподвигли меня написать маленький тест по сравнению производительности STL и MFC.
Тест достаточно простой - вставка элементов в CMap, std::map и stdext::hash_map. С помощью кода ниже я нагенерировал неповторяющиеся последовательноси символов
void GenerateSequence(const std::string& file_name,int nNumCh) { if(nNumCh>16) return; char buf[]="0123456789abcdefg"; std::string sRealStr(buf,buf+nNumCh); int nCount=0; std::ofstream f(file_name.c_str(),std::ios::out|std::ios::trunc); while(std::next_permutation(sRealStr.begin(),sRealStr.end())) { ++nCount; f<<" "<<sRealStr; if(!(nCount%15)) f<<std::endl; } }
тестировал на последовательностях из 6,7,8 и 9 символов, соответственно 720, 5040, 40320 и 362880 элементов. Результаты приведены ниже в виде таблицы и диаграммы, время в секундах
| STL map | MFC map | Initialized MFC map | STL hashmap | |
| 719 | 0.0006866790 | 0.0004520130 | 0.0003318860 | 0.0004151370 |
| 5039 | 0.00598372 | 0.00580493 | 0.00249222 | 0.00312610 |
| 40319 | 0.07176890 | 0.69810400 | 0.02297470 | 0.02608380 |
| 362879 | 0.77434000 | 241.62900000 | 0.24009400 | 11.61740000 |
Пару слов о легенде, думаю не совсем понятно, что такое Initialized MFC map - это перед использованием CMap контейнер инициализируется количеством элементов которые в него вставят.После этого теста многое стало на свои места - мы используем тот случай, который имеет самый высокий столбец на графике. Вот так вот ...
