Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.05.2008, 20:40
kraken kraken вне форума
Прохожий
 
Регистрация: 15.05.2008
Сообщения: 1
Репутация: 10
По умолчанию Как узнать время выполнения кусочка кода?

хоть мне кажется это уже давно разжеванный вопрос но у меня ничего не получается
делал и так
Код:
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  
Старый 15.05.2008, 20:53
Аватар для Winny
Winny Winny вне форума
Продвинутый
 
Регистрация: 26.05.2007
Адрес: Планета земля, Россия, Москва
Сообщения: 620
Репутация: 30
По умолчанию

Кидай на форму Timer (обязательно поставь Interval на позицию 1). Объяви переменную i в разделе var в самом начале. Поставь у Timer свойство Enabled в False. Пиши в обработчике OnTimer:
Код:
begin
Inc(i,1);
end;
А теперь в начале твоего кода вставь такую строчку:
Код:
Timer1.Enabled:=True
А в конце твоего кода вставь такую строчку:
Код:
Timer1.Enabled:=False;
ShowMessage('Код выполнялся (мс): '+IntToStr(i));
__________________

Ответить с цитированием
  #3  
Старый 16.05.2008, 08:34
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Ни один из методов не будет показывать правильно.
Главная причина в том, что точность системного таймера при использовании ОС Windows составляет около 25 мсек. И от навороченности компьютера не зависит. Поэтому, если ваш код выполняется менее 15-20 мсек., то вы в любом случае будете получать результат равный 0.

Последний раз редактировалось san-46, 16.05.2008 в 09:03.
Ответить с цитированием
  #4  
Старый 16.05.2008, 10:16
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Код:
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;
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.
Ответить с цитированием
  #5  
Старый 14.11.2010, 13:24
Fredwriter Fredwriter вне форума
Прохожий
 
Регистрация: 14.11.2010
Сообщения: 9
Репутация: 10
По умолчанию

Thrasher Спаибо большое за столь исчерпывающий ответ.
Всё понятно, кроме одного, зачем нужна задержка на 1 сотую сек. после выполнения кода?
Замечено, что получаются каждый раз разные Fr.
У меня частота процессора по бумажке 2.31 ГГц, то есть, если я не ошибаюсь, 2 310 000 000 герц, а с использованием метода Thrasher, в Code_Time у меня записывалось максимум аж 14 705 593 806 герц, и это то, что я переписал на бумажку, а бывало и за 17 ГГц. Непонятки.

Последний раз редактировалось Fredwriter, 14.11.2010 в 15:15.
Ответить с цитированием
  #6  
Старый 14.11.2010, 15:17
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Твой код,
Код:
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);
потом полученное время (ждать возможно придется долго) делишь на 1000000 и получаешь примерное время одного прохода. Тут уже можно как угодно - например делить на 1000 а не на миллион и посмотреть число, помня, что реальное время в 1000 раз меньше. Точно измерить невозможно - Windows же псевдопараллельная операционка.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 14.11.2010 в 15:20.
Ответить с цитированием
  #7  
Старый 15.11.2010, 04:50
Fredwriter Fredwriter вне форума
Прохожий
 
Регистрация: 14.11.2010
Сообщения: 9
Репутация: 10
По умолчанию

Bargest, Вы кому ответили kraken'у, он же не заходил на форум с 2008 года
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:54.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025