РЕКЛАМА 
баланопостит у мужчин

По воле рока, так случилось, иль 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

Results

Пару слов о легенде, думаю не совсем понятно, что такое Initialized MFC map - это перед использованием CMap контейнер инициализируется количеством элементов которые в него вставят.После этого теста многое стало на свои места - мы используем тот случай, который имеет самый высокий столбец на графике. Вот так вот ...

3 Comments

  1. Игорь:

    Эта проблема общеизвесна, во всяком случае на FireBird’е, там при вставке большого количества записей в индексированную таблицу рекомендуется отключать индекс, который перестраиваится каждый раз для новой записи.
    Не знаю о поведении MSSQL в этом случае.

  2. Vertitor:

    Vertitor…

    Прочитал на сайте (проблемы компьютера ) положительные отзывы о вашем ресурсе. Даже не поверил, а теперь убедился лично. Оказывается, меня …

  3. Codespan:

    Codespan…

    Путешествовал в Интернете и попал сюда. Какое замечательное изобретение человечества. При помощи сети общаешься, изучаешь, читаешь… Вот …

Leave a comment