![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
хоть мне кажется это уже давно разжеванный вопрос но у меня ничего не получается
делал и так Код:
procedure TForm1.Button1Click(Sender: TObject);
const
ms = 1/24/60/60/1000;
var i:integer;
t1, t2: tdatetime;
as1:array [1..1000] of integer;
begin
randomize;
t1 := now;
for i:=1 to 1000 do as1[i]:=random(40);
t2 := now - t1;
ShowMessage('Твой код выполнялся:'+inttostr(trunc(t2/ms))+'милисеунд');
end;Код:
var i:integer;
t:integer;
as1:array [1..1000] of integer;
begin
randomize;
t:=GetTickCount;
for i:=1 to 1000 do as1[i]:=random(40);
t:=t-GetTickCount
ShowMessage('Твой код выполнялся:'+inttostr(t)+'милисеунд');
end;вроди бы все верно но всегода показывает Твой код выполнялся:0 милисеунд Как быть? |
|
#2
|
||||
|
||||
|
Кидай на форму Timer (обязательно поставь Interval на позицию 1). Объяви переменную i в разделе var в самом начале. Поставь у Timer свойство Enabled в False. Пиши в обработчике OnTimer:
Код:
begin Inc(i,1); end; Код:
Timer1.Enabled:=True Код:
Timer1.Enabled:=False;
ShowMessage('Код выполнялся (мс): '+IntToStr(i)); |
|
#3
|
|||
|
|||
|
Ни один из методов не будет показывать правильно.
Главная причина в том, что точность системного таймера при использовании ОС Windows составляет около 25 мсек. И от навороченности компьютера не зависит. Поэтому, если ваш код выполняется менее 15-20 мсек., то вы в любом случае будете получать результат равный 0. Последний раз редактировалось san-46, 16.05.2008 в 09:03. |
|
#4
|
||||
|
||||
|
Код:
Var
T1,T2,Fr:Int64;
Code_time:Double;
function RDTSC: Int64; register; //Получение количество тактов процессора, со времени его включения
asm
rdtsc
end;
begin
//Узнаем частоту
T1:=RDTSC;
sleep(1000);
T2:=RDTSC;
Fr:=T2-T1;
T1:=RDTSC;
//Тут выполняем код, время исполнения которого нужно узнать
//
Sleep(10);
T2:=RDTSC;
Code_Time:=(T2-T1)/Fr*1000;
ShowMessage('код выполнялся '+FloatToStr(Code_Time)+' мс');
end; |
|
#5
|
|||
|
|||
|
Thrasher Спаибо большое за столь исчерпывающий ответ.
Всё понятно, кроме одного, зачем нужна задержка на 1 сотую сек. после выполнения кода? Замечено, что получаются каждый раз разные Fr. У меня частота процессора по бумажке 2.31 ГГц, то есть, если я не ошибаюсь, 2 310 000 000 герц, а с использованием метода Thrasher, в Code_Time у меня записывалось максимум аж 14 705 593 806 герц, и это то, что я переписал на бумажку, а бывало и за 17 ГГц. Непонятки. Последний раз редактировалось Fredwriter, 14.11.2010 в 15:15. |
|
#6
|
||||
|
||||
|
Твой код,
Код:
for i:=1 to 1000 do as1[i]:=random(40); Код:
for j:=0 to 1000000 do for i:=1 to 1000 do as1[i]:=random(40); Последний раз редактировалось Bargest, 14.11.2010 в 15:20. |