Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Разбор классических алгоритмов и олимпиадных задач. GetTickCount


Информационный Канал Subscribe.Ru

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

Теория
 Сегодня хотелось бы поговорить о способах замера времени выполнения того или иного кода. В случае если временной промежуток довольно велик, то я советую использовать системный таймер. В операционных системах семейства 9x таймер обновляется каждые 55 мс, в системах NT значительно чаще, порядка 10 мс.(Учтите: время он засекает правильно, просто обновляется не часто).
  Чтобы получить текущее состояние используйте WinAPI функцию GetTickCount, возвращающую число формата DWORD(4 байта, без знака), которое показывает сколько времени прошло со старта Windows. Также в Win SDK сказано, что значение обнулиться по истечению 49.7 дней.
  Будем изучать на примере: допустим нам нужно возвести число 2 в 30-ю степень.
 Все приложения я буду делать консольными(File>New>Other>Console Application).
1-ый способ:
var
k,R:integer;
begin
R:=1;
for k:=0 to 29 do
R:=R*2;
2-ой способ: использовать использовать функцию Power из модуля Math:
R:=Trunc(Power(2,30));
3-ий способ: использовать логический оператор SHL(cдвиг битов влево, тем самы умножая на 2):
R:=1 shl 30;
Перейдём к замерам. Все методы выполняются намного быстрее 10 мс и поэтому мы один и тот же кусок кода должны выполнять множество раз(я выполнял 50000000 раз). Я приведу код для shl.
uses
SysUtils,Windows;
var
k:integer;
R:integer;
c1,c2:Cardinal;
begin
c1:=GetTickCount;
for k:=1 to 50000000 do
R:=1 shl 30;
c2:=GetTickCount;
writeln(c2-c1);
readln;
end.
У меня получились вот такие результаты:
Метод
Общее время выполнения,c
Цикл
7,88
Power
22,08
SHL
0,16


http://subscribe.ru/
http://subscribe.ru/feedback/
Адрес подписки
Отписаться

В избранное