Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Пример измерения времени выполнения




Циклы ожидания

 

Внимание! Недопустимо использовать в программе реализацию цикла ожидания, подобную while (clock() < endwait) {}, так как для выполнения будет использовано всё доступное процессорное время текущего процессора, расходуемое на определение текущего времени (clock()) с максимально возможной скоростью. Другие процессы, выполняемые на текущем компьютере, будут вытеснены планировщиком задач операционной системы на время работы данного цикла (в разных операционных системах поведение будет различаться).

Более правильной реализацией будет while (clock() < endwait) { Sleep(0);}, однако точность ожидания будет находиться в пределах одного кванта процессора, т.е. порядка 5-30 миллисекунд и будет зависеть от загрузки текущего процессора.

 

void wait (int seconds)

{

clock_t endwait;

endwait = clock () + seconds * CLOCKS_PER_SEC;

while (clock() < endwait) { Sleep(0);}

}

 

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

Примечание: реализации указанной выше функции существуют во всех операционных системах и называются Sleep(int milliseconds) в MS Windows, usleep(int microseconds) в UNIX-системах.

 

#include <windows.h>

 

#include <time.h>

#include <stdlib.h>

#include <stdio.h>

 

int main()

{

time_t t0, t1;

clock_t c0, c1;

DWORD tt0, tt1;

 

// ******** средства PerformanceCounter ***********

LARGE_INTEGER pct0, pct1, freq;

QueryPerformanceFrequency(&freq); // определяем частоту таймера

HANDLE hThread = GetCurrentThread();

// устанавливаем выполнение текущего потока на первом ядре первого процессора

DWORD_PTR prevMask = SetThreadAffinityMask(hThread, 1);

// завершаем квант процессорного времени для гарантированного переключения

// на заданный процессор

Sleep(0);

// *************************************************

 

// измеряем время начала отсчета 4-мя способами

// В реальной программе следует выбрать какой-нибудь один!

t0 = time(NULL); // способ 1

c0 = clock(); // способ 2

tt0 = GetTickCount(); // способ 3 (только MS Windows)

QueryPerformanceCounter(&pct0); // способ 4 (только MS Windows)

 

// ждем 1 секунду

Sleep(1000);

 

// измеряем время окончания 4-мя способами

t1 = time(NULL);

c1 = clock();

tt1 = GetTickCount();

QueryPerformanceCounter(&pct1);

 

 

// разрешаем выполнение потока на всех доступных процессорах

SetThreadAffinityMask(hThread, prevMask);

 

// выводим результат измерения

printf ("\tTime in milliseconds\n");

printf ("\telapsed wall clock time: %ld\n", (long) (t1 - t0)*1000);

printf ("\telapsed CPU time: %f\n",

(float) (c1 - c0)/CLOCKS_PER_SEC*1000.0);

printf ("\telapsed GetTickCount time: %ld\n", (tt1 - tt0));

printf ("\telapsed PerformanceCounter time: %d\n",

(unsigned int) (((double)pct1.QuadPart /(double) freq.QuadPart -

(double)pct0.QuadPart / (double) freq.QuadPart) * 1000));

 

return 0;

}




Поделиться с друзьями:


Дата добавления: 2014-11-25; Просмотров: 395; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.