Сроки STL Контейнеры — Широкая вариация?

Я использую следующий метод для определения времени некоторых операций над векторами контейнеров STL, deque, list, multiset и multimap.

PrecisionTimer::PrecisionTimer()
{
LARGE_INTEGER cps;
LARGE_INTEGER init_cnt;

QueryPerformanceCounter( &init_cnt );
QueryPerformanceFrequency( &cps );

start_count = init_cnt.QuadPart;
microseconds_per_count = 1000000.0 / cps.QuadPart;
}

void PrecisionTimer::ReStart()
{
LARGE_INTEGER init_cnt;
QueryPerformanceCounter( &init_cnt );
start_count = init_cnt.QuadPart;
}// in microseconds
unsigned int PrecisionTimer::ElaspedTime() const
{
LARGE_INTEGER cnt;
QueryPerformanceCounter(&cnt);
return (unsigned int)( ( cnt.QuadPart - start_count )
* microseconds_per_count + 0.5 );
}

Процесс просто такой:
У меня есть список, полный строк, переместить их в вектор, а затем добавить элементы из вектора в контейнер STL. Затем я удаляю все элементы из контейнера и получаю время, которое заняло микросекунды.

Мой вопрос о вариациях: иногда моя пробная версия на 60 000 с лишним микросекунд отличается от первой. Зачем? Это связано с реализацией таймера? Я был направлен в сторону эффектов временного среза и кеша с высокой речью. Кто-нибудь может уточнить это? Влияет ли на это использование процессора?

Я не прошу лучшей реализации таймера. Я спрашиваю, почему это меняется.

1

Решение

Проще говоря, в системе имеется небольшое количество ядер процессора, но одновременно запущено большое количество процессов. Для этого ОС будет выделять время процессу, прежде чем делать то же самое для следующего и так далее. В зависимости от того, что делают программы, им может не понадобиться ни один, ни часть, ни весь их временной интервал. Поскольку это варьируется, как и число запущенных процессов, вы можете иметь переменный промежуток времени между каждым вызовом вашего кода — что в сочетании с постоянным временем выполнения вашего собственного кода приводит к разному количеству секунд, истекших на настенные часы с момента, когда вы запустили свою программу, до момента ее завершения.

Так как QueryHighPerformance функция возвращает прошедшее время на настенных часах, она не учитывает эти различия в расписании и, таким образом, сообщает о различном количестве времени, необходимого для выполнения одного и того же кода с теми же данными. Идеальный таймер будет возвращать время, затраченное только вашим процессом — очень похоже на столбец «CPU Time», доступный в диспетчере задач Win7 (View-> Select Columns-> CPU Time)

1

Другие решения


По вопросам рекламы [email protected]