2014-12-08 4 views
1

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

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); 
} 

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

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

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

+0

По той же причине требуется час для часы идут с 16:55 до 17:00 в пятницу - инопланетяне! –

+0

Собираетесь ли вы с оптимизацией? Вы уверены, что код, который вы используете, не оптимизирован, если у него нет побочных эффектов? Не видя тестов, которые вы запускаете, довольно сложно догадаться. –

+0

Ваши тесты времени бессмысленны, если вы используете неоптимизированную или «отладочную» сборку. – PaulMcKenzie

ответ

1

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

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