2013-11-12 2 views
0
#include "TIMER1.h" 
#include "MAIN.h" 
typedef unsigned _int64 uint64; 

void TASK1() 
{ 
uint64 freq, start, end, diff; 
//unsigned int milliseconds; 

QueryPerformanceFrequency((LARGE_INTEGER*)&freq); 
QueryPerformanceCounter((LARGE_INTEGER*)&start); 

// code to measure 
printf("hi\n"); 
printf("hi1\n"); 
printf("hi2\n"); 

QueryPerformanceCounter((LARGE_INTEGER*)&end); 
diff = (((end - start) * 1000)/freq); 
//milliseconds = (unsigned int)(diff & 0xffffffff); 
printf("It took %u ms\n",diff); 

} 

Я вызываю функцию void TASK1() несколько раз из основного и анализируя время, затраченное на печать, как в приведенном выше коде (т.е. hi, hi1, hi2). Я вычисляю разницу во времени между временем начала и временем окончания печати hi, hi1, hi2. Мой вопрос: почему я получаю задержку в выходе и не умею печатать точно так, как ожидалось.Какова максимальная задержка или дрожание при использовании счетчика Queryperformance?

ошибка в выводе: привет hi1 hi2 потребовалось 0ms

привет hi1 Hi2 потребовалось 1ms

иногда на выходе: HI1 hi2 потребовалось 2ms

В чем причина этого? Как изменить приведенный выше код от миллисекунд до микросекунд?

+0

Трудно сказать, однако проблема с QueryPerformanceCounter является то, что его точность может быть подвергнуто деградации на современных процессорах, которые используют функции энергосбережения. Во всяком случае, здесь есть интересный пост: http://stackoverflow.com/questions/7287663/queryperformancecounter-status он может помочь. Находясь на уровне пользователя, вы также должны учитывать задержку между моментом, когда вы получаете время и момент, о котором сообщается вашим приложением. – Jekyll

+0

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

+0

- это правильный способ преобразования в микросекунды diff = (((end-start) * 1000000)/freq); ?? – user2984410

ответ

0
  1. Изменение задержек. ... в чем причина?

    printf() синхронизируется с другими процессами и поэтому может меняться в требуемое время.

  2. ... как изменить приведенный выше код от миллисекунд до микросекунд?

    diff = (((end - start) * 1000000)/freq); 
    printf("It took %u us\n",diff); 
    
Смежные вопросы