Насколько реально отсчитать кол-во пройденного время пока программа выполняет какую-то цепочку опереций?
Вот я например так делаю
var
_start,_end : real; \\ можно и TDateTime, смысл получает одинаковым как я заметил;
в каком-то месте программы пишу _start:=GetTime;
потом дальше по ходу её выполнения где-то еще написано
_end:=GetTime;
label1.caption:=FloatToStrF((_end-_start)/86400,ffFixed,30,10); от конечного время отнимаем начальное и делим на колво секунд в сутках (вроде их 86400). Так как как я понял GetTime считает время и от 00:00 до 23:59 меленно насчитывает единицу за сутки, поэтому (_end-_start)/86400 мне показалось правильным хотя не уверен на счет того как правильно посчитать в секунды. Ну и в результате получеатся примерно 0,0000000000... ну иногда 0,0000000001 или 0,0000000002. Это ж вобще ни что. Хотя программа в этом промежутки проходит около 800 строк. Может я что-то не то делаю? или не так
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
09-12-2008 18:14
закрыт, только мне хотелось бы узнать 15 мс это много для какого-то действия программы или нет
Смотря каких... Три волоса - много или мало? На голове - мало, в тарелке с супом - много.
Не зная, что именно делает программа, оценить разумное время выполнения - ну никак... :-))
Можно лишь добавить самую малость к переводу в текстовой формат и обратно.
Там существует необязательный параметр типа TFormatSettings, который представляет из себя запись с 20 "вложениями".
Для того, чтобы правильно/красиво получить нужное значение, объявите переменную типа TFormatSettings
и измените нужные параетры "под себя" перед вызовом необходимой функции, куда и запишете эту переменную.
Например:
var FS: TFormatSettings;
...
fs.TimeSeparator:=':'; //разделитель времени (часы:минуты:секунды)
fs.DecimalSeparator:=','; //разделитель между целой и дробной частью
fs.CurrencyDecimals:=2; //количество знаков в дробной части
fs.LongTimeFormat:='hh:mm:ss'; //формат времени
07-12-2008 17:38 | Комментарий к предыдущим ответам
так результат получается 0,0000000 всегда нули. если не делить то 15,000 16,000
Значит, проверяйте деление. Боюсь ошибиться, но мне кажется, что если 15000 разделить на 1000, то
должно получиться 15. Может быть, все-таки не стоит пользоваться делением на 1000 в виде: (TEnd-TStart) div 1000,
потому что если время выполнения меньше секунды, то результат действительно равен нулю. Выводите время
(то есть разность "показаний" GetTickCount) прямо в миллисекундах, если для себя. Привыкнуть считать время
в миллисекундах не так уж сложно. :-)
Или T:=(TEnd-TStart)/1000, где T-вещественное число, если для пользователя, получите секунды с долями.
Вообще, чтобы было понятно - система предоставляет две функции: Now (текущее время и дата) - если надо знать текущее
время и/или дату, или же если надо измерять большие промежутки времени. Точнее, это не функция OS, это уже "обвертка" Dеlphi.
В качестве исходной используется функция API GetLocalTime. Или, как частный случай - в Delphi есть ф-ции
Date и Time (соответственно целая и дробная часть).
А вот если надо точно измерять относительно небольшие промежутки времени (т.е. нужна только разность времен между
началом и концом цепочки операций) - для этого Windows предоставляет ф-цию GetTickCount - количество миллисекунд
с момента запуска системы. Текущее время с помощью этой функции узнать нельзя, для этого она и не предназначена,
но интервалы времени меряет замечательно; так что пользуйтесь ею, что вам справедливо посоветовали и Mansiper,
и Сергей Рощин. Все-таки инструменты надо использовать по назначению. :-)
"Попробуйте использовать GetTickCount вместо GetTime и соответственно поменяйте тип на Cardinal. Разницу между окончанием и началом процессов делите целочисленно (DIV) на 1000 и получите количество секунд." так результат получается 0,0000000 всегда нули. если не делить то 15,000 16,000
а если делать как я делал только не делить на 86400, а умножать то получается от 0,015 до 0,036 насколько эти цифры реальны?
Чтобы из суток получить секунды, надо не делить, а умножать на 86400. Используйте не GetTime, а NOW для получения даты и времени, иначе при переходе через 12 часов ночи будет отрицательное время.
Но лучше GetTickCount, а еще лучше см. http://www.delphikingdom.com/asp/viewitem.asp?catalogid=455 и комменты.
var
BeginTime: TTime;
begin
BeginTime:= Time();
try
// <--- Здесь программа выполняет какую-то цепочку операций
finally
Label1.Caption:= 'Время выполнения: ' + TimeToStr(Time() - BeginTime);
end;
end;
Попробуйте использовать GetTickCount вместо GetTime и соответственно поменяйте тип на Cardinal. Разницу между окончанием и началом процессов делите целочисленно (DIV) на 1000 и получите количество секунд.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.