|
Вопрос # 2 658/ вопрос открыт / |
|
Здравствуйте, эксперты! У меня был код(см в приложении), мне надо посчитать время которое использует процессор на выполнение этого алгоритма в милисекундах, а у меня он находит не в милисекундах а как часть суток. Помогите пожалуйста как мне найти это время в милисекундах!
Приложение: Переключить в обычный режим- var m:array [1..n,1..k]of real;
- x:array [1..n] of real;
- i,j,q,w:integer;
- a:Extended;
- f:textfile;
- s,s1:string;
- t,t1:TDateTime;
- begin
- ...............
- t:=GetTime;
-
- for i:=1 to n do
- begin
- for j:=1 to k do
- begin
- write(m[i,j]:5:3,' ')
- end;
- writeln;
- end;
- for i:=1 to n do
- x[i]:=0;
- a:=0;
- for i:=n downto 1 do
- begin
- for j:=n downto i do
- begin
- a:=a+m[i,j]*x[j];
- end;
- x[i]:=(-a+m[i,k])/m[i,i];
- end;
- writeln('*******************');
- for i:=1 to n do
- write(x[i]:8:4,' ');
- end;
- t1:=GetTime;
- writeln;
- Writeln('vremya ',t1-t);
- readln;
- end.
 |
Вопрос задал: Kraken (статус: Посетитель)
Вопрос отправлен: 19 апреля 2009, 17:29
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: min@y™
Ну, естественно. Функция GetTime() возвращает текущее время в типе TDateTime. Конечно, это время можно перевести в миллисекунды процедурой DecodeTime() типа так:
var
h, m, s, ms: Word;
begin
t1:= GetTime;
DecodeTime(t1, h, m, s, ms);
Writeln('vremya ', h * 3600000 + m * 60000 + s * 1000 + ms);
end;
Но, чтобы не заморачиваться, можно юзать функции попроще, например, GetTickCount(), возвращающую время в виде целого числа миллисекунд.
Однако, на малых интервалах времени (0...16 мс) такие функции дают чудовищную погрешность. Если требуется бОльшая точность на малых интервалах времени, могу предложить воспользоваться классом THRTimer, основанном на тактовой частоте процессора. Где я его взял – уже не помню, автор – не я, но обработать напильником мне его немного пришлось. Прицепляю к ответу модуль. К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 19 апреля 2009, 18:02
|
Ответ #2. Отвечает эксперт: Виталий
Здравствуйте, Kraken!
Через дату считать затратно. Вот решение через тактовую частоту в обёртке функций.
var
TimerFreq, TimerStart : Int64;
procedure TimerStart;
begin
QueryPerformanceFrequency(TimerFreq);
QueryPerformanceCounter(TimerStart);
end;
function GetTime(Reset : Boolean = false) : Int64;
var
Count : Int64;
begin
QueryPerformanceCounter(Count);
Result := Trunc(1000 * ((Count - TimerStart) / TimerFreq));
if Reset then TimerStart := Count;
end;
функции стандартные
const
kernel32 = 'kernel32.dll';
function QueryPerformanceFrequency(out Freq: Int64): Boolean; stdcall; external kernel32;
function QueryPerformanceCounter(out Count: Int64): Boolean; stdcall; external kernel32;
Сначало запускаете таймер процедурой TimerStart;
И потом в любой момент получаете время в мс с помощью GetTime. Если reset = true, то таймер сбрасывается на 0.
 |
Ответ отправил: Виталий (статус: 2-ой класс)
Время отправки: 20 апреля 2009, 11:38
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 21 апреля 2009, 15:05; участников в обсуждении: 2.
|
n4r.c0m (статус: Посетитель), 20 апреля 2009, 14:50 [#1]:
А не проще сделать так:
var time: cardinal;
begin
time := GetTickCount;
// ...
// ваш код
// ...
time := GetTickCount-time;
ShowMessage(IntToStr(time));
end;
time и будет результат скорости вашего кода, измеряемый в "тиках" таймера, оно-же и будет миллисекундами.
p.s: GetTickCount - window'ая функция. Интерфейс находиться в модуле Windows.
p.p.s: The GetTickCount function retrieves the number of milliseconds that have elapsed since Windows was started.
|
|
Виталий (статус: 2-ой класс), 21 апреля 2009, 15:05 [#2]:
Здесь дело в точности.
Почитайте данную статью : http://www.osp.ru/pcworld/2003/03/165324/
Вот отрывок :
"Один из методов измерения времени уже был описан в журнале, но он возможен только в одной ОС (DOS и совместимые с ней). Другие операционные системы обладают собственными инструментами измерения времени, например Windows включает сообщение таймера или функцию GetTickCount. К сожалению, хотя такие средства и предоставляются разными ОС, они имеют общие недостатки, в первую очередь низкую точность и большую погрешность измерения. Так, в DOS время отсчитывается квантами по 55 мс, в Windows 95 — по 13,7 мс (видимо, эта величина зависит от конфигурации ПК), а в Windows 98/NT — по 5 мс. Таким образом, получается интервал, который существенно больше принятого для отсчета измеряемой величины: для DOS — 0,01 с, для Windows — 1 мс. С периодичностью вызова сообщения таймера дело обстоит еще хуже. Их частота не превышает 18,2 в секунду, а минимальный интервал составляет все те же 55 мс. Кроме того, опыты показывают, что приращение времени — величина непостоянная. "
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|