В общем мне удалось локализовать проблему, но она из разряда необъяснимых флуктуаций.
После сравнительного анализа комплексной производительности двух компов, который показал 25%-ое превосходство
Компа 2 над
Компом 1, я стал тестировать в режиме отладки отдельные участки кода на их быстродействие. Основным предметом моего исследования стали stl-контейнеры, которые я заполнял различными типами данных. Вскоре выяснилась странность в поведении вот такого вектора:
std::vector<void*>, который как раз и давал примерно семикратную задержку во времени в момент последовательного его заполнения. Привожу свой тестовый код:
boost::timer::cpu_timer Timer1;
typedef std::vector<void*> TestVector;
const TestVector::size_type VectorSize = 5000000;
TestVector TmpVector;
TmpVector.reserve(VectorSize);
for (TestVector::size_type i = 0; i < VectorSize; i++)
{
TmpVector.push_back(new double(0.001));
}
// Очистка контейнера
BOOST_FOREACH(const TestVector::value_type &TmpVal, TmpVector)
{
double* tt = (double*) TmpVal;
delete tt;
}
TmpVector.clear();
boost::chrono::duration<double> sec;
sec = boost::chrono::nanoseconds(Timer1.elapsed().user);
Timer1.stop();
std::stringstream sst;
sst << boost::format("\nTime: <%f>") % sec.count();
OutputDebugStringA(sst.str().c_str());
В программе я использовал данный тип контейнера как универсальный инструмент для хранения указателей различных типов объектов. И вот, стоит только в этом тестовом коде заменить
std::vector<void*> на
std::vector<double*> как он начинает выполняться без задержек и укладывается в 0,32 с, в то время как в исходном состоянии этот код на данной машине выполнялся за 2,4 с.
Хочу ещё раз отметить, что такая проблема появилась на этом компе вдруг и совершенно внезапно: раньше всё работало безупречно. Кроме того, я протестировал работу программы ещё на нескольких машинах, включая довольно слабые ноутбуки - везде всё работает без задержек. И ещё, некоторые пользователи конкретно этой программы (по моей просьбе) сообщали мне информацию о её быстродействии. И среди этих сообщений были и такие, в которых время выполнения многократно не совпадало с ожидаемым. Поэтому в какой-то степени я рад, что эта флуктуация произошла на доступной для меня машине.