Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определить время работы функции, Как определить (GetTickCount)? 
V
    Опции темы
MadCoder
Дата 12.3.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: нет
Всего: 2



Нужно определить, сколько секунд, минут или часов работала функция (в формате 00:00:00).

Вот мой алгоритм определения:
Код


function Some: Boolean;
var
A: Integer;
begin
A:=GetTickCount;
// Выполняю определенные действия
ShowMessage('Прошло времени: '+ FormatDateTime('tt', TimeStampToDateTime(MSecsToTimeStamp(GetTickCount-A))));
end;


Функция обрабатывается, но при работе программы возникает ошибка... Помогите пожалуйста smile .
PM WWW ICQ   Вверх
Rrader
  Дата 12.3.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 18
Всего: 191



Потому что GetTickCount - A дает 0 из-за мгновенного выполнения подпрограммы. Тут можно просто проверку вставить...


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
MadCoder
Дата 12.3.2008, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: нет
Всего: 2



Цитата(Rrader @ 12.3.2008,  15:17)
Потому что GetTickCount - A дает 0 из-за мгновенного выполнения подпрограммы. Тут можно просто проверку вставить...

Да нет, 6 секунд и больше....

Добавлено через 3 минуты и 52 секунды
Я понял, что мне нужно: как конвертировать количество миллисекунд в формат часы:минуты:секунды (к примеру: 3600000 в 01:00:00 - 1 час).
PM WWW ICQ   Вверх
Alix
Дата 12.3.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



Цитата
Use TTimeStamp to represent date and time values when a great deal of accuracy is required for the time portion.  When the time values do not need to be precise to the millisecond, use the more compact TDateTime representation. 

таким образом, ты в любом случае, теряешь в точности, переводя в tdatetime формат. Напиши что-то вроде:
Код
  a := GetTickCount-A;
  showmessage(format('%2d:%.3f', [a div 60000, (a mod 60000) / 1000]));


Добавлено через 1 минуту и 1 секунду
Цитата(MadCoder @  12.3.2008,  15:31 Найти цитируемый пост)

Я понял, что мне нужно: как конвертировать количество миллисекунд в формат часы:минуты:секунды (к примеру: 3600000 в 01:00:00 - 1 час).

опоздал я с ответом ) ну в общем идею ты в моем ответе, думаю, увидишь


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
MadCoder
Дата 12.3.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: нет
Всего: 2



Цитата(Alix @ 12.3.2008,  15:38)
Цитата
Use TTimeStamp to represent date and time values when a great deal of accuracy is required for the time portion.  When the time values do not need to be precise to the millisecond, use the more compact TDateTime representation. 

таким образом, ты в любом случае, теряешь в точности, переводя в tdatetime формат. Напиши что-то вроде:
Код
  a := GetTickCount-A;
  showmessage(format('%2d:%.3f', [a div 60000, (a mod 60000) / 1000]));


Добавлено @ 15:39
Цитата(MadCoder @  12.3.2008,  15:31 Найти цитируемый пост)

Я понял, что мне нужно: как конвертировать количество миллисекунд в формат часы:минуты:секунды (к примеру: 3600000 в 01:00:00 - 1 час).

опоздал я с ответом ) ну в общем идею ты в моем ответе, думаю, увидишь

Мне достаточно округление до 1 секунды.

Вообщем, вот что получилось:
Код

format('%2d:%2d:%2d', [Statistics[A].WorkTime div 3600000, (Statistics[A].WorkTime mod 3600000) div 60000, (Statistics[A].WorkTime mod 60000) div 1000]))

где Statistics[A].WorkTime = время в миллисекундах.

Вот только он показывает не 03:02:01, а 3:2:1 (т.е. нули впереди не ставит) :(.
PM WWW ICQ   Вверх
Alix
Дата 12.3.2008, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



Цитата(MadCoder @  12.3.2008,  16:14 Найти цитируемый пост)
Вот только он показывает не 03:02:01, а 3:2:1 (т.е. нули впереди не ставит) :(. 

а ты напиши там такой формат: '%.2d:%.2d:%.2d'


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
MadCoder
Дата 12.3.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: нет
Всего: 2



Цитата(Alix @ 12.3.2008,  16:23)
Цитата(MadCoder @  12.3.2008,  16:14 Найти цитируемый пост)
Вот только он показывает не 03:02:01, а 3:2:1 (т.е. нули впереди не ставит) :(. 

а ты напиши там такой формат: '%.2d:%.2d:%.2d'

Все работает, большое всем человеческое спасибо! smile 
PM WWW ICQ   Вверх
Sinneren
Дата 28.9.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


{YaGoo}
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 20.3.2009
Где: Уфа

Репутация: нет
Всего: 1



GetTickCount - не понимаю что это
и Statistics[A].WorkTime это тоже. ещё и не работает.
в общем у меня 
Код

a := GetTickCount-A;
StatusBar1.Panels.Items[1].Text:='Время Сессии'+format('%.2d:%.2d:%.2d', [a div 3600000, (a mod 3600000) div 60000, (a mod 60000) div 1000]);

такой вот код стоит на таймере с дефолтным интервалом.
однако выводит странное время.. после начала программы 8 часу 40 минут...когда как.
вероятно это потому что я не знаю GetTickCount что это такое.что же мне написать нужно,чтобы время начинало отсчтёт от старта это процедуры,тобишь включения таймера.
PM MAIL WWW ICQ Skype   Вверх
Virtuals
Дата 29.9.2009, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 1
Всего: 11



чет вообще не понял зачем столько сложностей?. 99,9% современных процессоров потдерживают функцию 
RDTSC  (получить количество тактов с момента старта ЦПУ)
вот код, интуитивно понятен, проверку на тип процессора не производил,..../за основу взят код из DRKB/
бросить на форму
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
и далее.
//точность будет зависеть, от того как точно опознаете скорость цпу. + данный способ, при приложении опр. фантазии, позволит даже измерить, время между событиями в разных программах smile.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
DelayTime = $500;
//все обьявляем глобально дабы измерять в любом месте кода.
var
Timer: packed RECORD
        Lo: DWORD;
        Hi: DWORD;
       END;
Timer64_:int64 absolute Timer;
SpeedCPU,ResTick: int64;

procedure GetCLKCPU;
asm
{ $0F31 op-code for RDTSC Pentium инструкции }
{ возвращает 64-битное целое (Integer) }
   dw 310Fh
   mov Timer.Lo, eax
   mov Timer.Hi, edx
end;

procedure DeltaCLKCPU;
asm
   dw 310Fh // rdtsc
   sub eax, Timer.Lo
   sbb edx, Timer.Hi
   mov Timer.Lo, eax
   mov Timer.Hi, edx
end;
//------------
procedure TForm1.FormCreate(Sender: TObject);
var
    PriorityClass : Integer;
    Priority : Integer;
begin
//задираем приоритет по самое.... дабы точнее посчитать.
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
SleepEx(10, FALSE);
//самое важное тут, считаем скорость процессора в KHz.
try
GetCLKCPU;
SleepEX(DelayTime, False);
DeltaCLKCPU;
SpeedCPU := Timer64_ div DelayTime;
except end;

SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Label1.Caption:=inttostr(SpeedCPU)+' KHz';

GetCLKCPU; //получим общее количество тактов процессора, с момента старта оного!!! :)
Label2.Caption:=inttostr(Timer64_ div SpeedCPU)+' мСек, с момента подачи питания на CPU';
//----
Timer64_:=Timer64_ div SpeedCPU;
ss:=Timer64_ mod 1000;Timer64_:=Timer64_ div 1000;
s:=Timer64_ mod 60;Timer64_:=Timer64_ div 60;
m:=Timer64_ mod 60;Timer64_:=Timer64_ div 60;
h:=Timer64_ mod 24;Timer64_:=Timer64_ div 24;
d:=Timer64_;
Label5.Caption:=format('с момента старта CPU %.4d день %.2d:%.2d:%.2d.%.3d',[d,h,m,s,ss])

end;
//===============
procedure TForm1.Button1Click(Sender: TObject);
begin
GetCLKCPU; //меряем время выполнения с этого места
sleepex(777,false);
DeltaCLKCPU; //и по сюда :).
//
ResTick:=Timer64_ div SpeedCPU; //делим количество тактов, на скорость CPU/
Label3.Caption:=inttoHEX(Timer64_,16)+' столько тактов процессора выполнялось.';
Label4.Caption:=inttostr(ResTick)+'   столько мСек. выполнялось.';
end;

end.



Добавлено @ 07:38
все далее в любом месте, по аналогии

Код

GetCLKCPU; //меряем время выполнения с этого места
//измеряемый участок
...

DeltaCLKCPU; //и по сюда :).

и вывод результата
Код

ResTick:=Timer64_ div SpeedCPU; //делим количество тактов, на скорость CPU/
Label3.Caption:=inttoHEX(Timer64_,16)+' столько тактов процессора выполнялось.';
Label4.Caption:=inttostr(ResTick)+'   столько мСек. выполнялось.';


Это сообщение отредактировал(а) Virtuals - 29.9.2009, 08:04
PM MAIL ICQ   Вверх
AntonN
Дата 29.9.2009, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 3
Всего: 18



зачем эти хромированные костыли? http://forum.vingrad.ru/index.php?showtopi...t&p=1977444


--------------------
user posted image
PM MAIL WWW   Вверх
Virtuals
Дата 29.9.2009, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 1
Всего: 11



AntonN, QueryPerformanceFrequency, QueryPerformanceCounter

 и есть обертка для

Код

procedure GetCLKCPU;
asm
{ $0F31 op-code for RDTSC Pentium инструкции }
{ возвращает 64-битное целое (Integer) }
   dw 310Fh
   mov Timer.Lo, eax
   mov Timer.Hi, edx
end;

procedure DeltaCLKCPU;
asm
   dw 310Fh // rdtsc
   sub eax, Timer.Lo
   sbb edx, Timer.Hi
   mov Timer.Lo, eax
   mov Timer.Hi, edx
end;

 smile 
а все остальное пример как пользовать. тоесть вода... и надеюсь никто не будет спорить что точней и быстрей отработает, код в асме или вызов Ф из длл.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0931 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.