Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 424

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Требуется посчитать время выполнения функции, от нажатия на кнопку до вывода результата!

operKOT Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: operKOT (статус: Посетитель)
Вопрос отправлен: 18 февраля 2009, 00:58
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, operKOT!
Очень просто. Есть такая функция GetTickCount. Она выдает количество "тиков" от запуска системы. один тик - одна тысячная секунды. Для измерения нам понадобиться дописать 4 строки.
1) объявить переменную, которая будет хранить время
var t:cardinal;
2) там, где надо начать считать время, пишем
t := GetTickCount;
3) там, где закончилась работа, которую надо сосчитать
t := GetTickCount - t;
4) и выводим время Showmessage(inttostr(t)+' ms');
Можно разделить на 1000 и получить в секундах.

Только надо помнить, что если время выводиться меньше 50 мс, то доверять такому времени нельзя. Если для какого то участка кода выдает 10 и меньше - стоит завернуть этот код в цикл и повторить пару тысяч раз, что бы хотя бы до 3-5 секунд дотянуть. Потом разделив, получим искомое время.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 18 февраля 2009, 02:40

Ответ #2. Отвечает эксперт: Пупкин В В

Здравствуйте, operKOT!
если необходимо измерять еще меньшие интервалы времени - немного лучше использовать функцию QueryPerformanceCounter();
И min@y прав в режиме многозадачности система в любой момент может переключится на другой процесс или поток что приводит к не правильным результатам. Для корректировки вам в помощь функция GetThreadTimes();

Ответ отправил: Пупкин В В (статус: 2-ой класс)
Время отправки: 18 февраля 2009, 10:41


Мини-форум вопроса

Всего сообщений: 14; последнее сообщение — 18 февраля 2009, 16:34; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 18 февраля 2009, 10:04 [#1]:

И всё равно это будет время выполнения функции на фоне выполнения других процессов системы. Система-то многозадачная!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 18 февраля 2009, 10:12 [#2]:

to min@y™
м, наверно физику в школе/вузе плохо учили и не знаете что любое, абсолютно любое измерение влиеяет на результат. Есть даже парадокс о кошке и яде в черном ящике - что пока не откроем, не знаем, жива она или нет, но открыв, мы спортили эксперемент(я немного утрировал:) ).
Вот именно по этой причине я и написал, что если время маленькое, то надо делать больше замеров.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 18 февраля 2009, 11:07 [#3]:

Цитата:

Вот именно по этой причине я и написал, что если время маленькое, то надо делать больше замеров.


Не вижу связи с моим комментарием.
Я имел в виду, что Windows переключает выполнение запущенных процессов, функция GetTickCount() возвращает общее время в миллисекундах с момента старта системы. Поэтому замер времени от начала до конца выполнения алгоритма в многозадачной системе будет однозначно произведён с учётом времени выполнения других процессов в промежутке работы заданного алгоритма.

Физику я изучал на отлично. Могу диплом отсканировать и прислать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 18 февраля 2009, 11:31 [#4]:

Читаем внимательнейше вопрос. Человек простит как сосчитать время, которое прошло от нажатия кнопки до вывода результата! не время выполнения функции, а время которое прошло! В этом случае многозадачность нам побоку.
to Пупкин В В
Ещё бы ассемблерные команды порекомедовали для измерения кол-ва тактов....
Галочка "подтверждения прочтения" - вселенское зло.
Пупкин В В

Пупкин В В (статус: 2-ой класс), 18 февраля 2009, 11:41 [#5]:

мои рекомендации основаны только на реальной практике.
я просто указал на еще одну возможность которая может быть более приемлема к конкретной задаче. GetTickCount вполне устраивает. Но часто выручала QueryPerformanceCounter();
min@y™

min@y™ (статус: Доктор наук), 18 февраля 2009, 11:43 [#6]:

А разве это не предполагает время выполнения некоторого алгоритма?
Ведь, при разных условиях оно будет разное.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 18 февраля 2009, 12:02 [#7]:

to Пупкин В В
Никогда не приходилось использовать эту функцию. К тому же, если вы уж её используете, почему не удосужились пример использования набросать?
А если мне уж надо отладить быстрый код, то я использую профайлер. Там можно увидеть кто и как тормозит. И разработчики профайлеров умеют учитывать всякие переключения контекстов и особенности оси лучше меня. Правда показания профайлера нужно уметь читать.
to min@y™
ну и?
Разное говорите?
Ну да, например расчёт факторила при разных входных значениях.
А представте, что там чтение с сети. В этом случае вообще можно пренебречь переключениями. Ведь в этом случае будут переключения в режим ядра и они будут входить в время выполнения алгоритма.
С другой стороны, подождем вопрошающего. Он то и определиться, что же ему надо.
Галочка "подтверждения прочтения" - вселенское зло.
Пупкин В В

Пупкин В В (статус: 2-ой класс), 18 февраля 2009, 12:10 [#8]:

мало вероятно что человеку интересно сколько времени он просидел перед компом после нажатия на кнопку до окончания работы кода.
скорее всего интересует насколько быст код, а тут не обойтись без учета многозадачности. ГЛАВНОЕ чтоб не появлялись разного рода статьи и посты на форумах которые кричат о результатах НЕПРАВИЛЬНОГО тестирования.
Вадим К

Вадим К (статус: Академик), 18 февраля 2009, 12:37 [#9]:

А вообще то основной массе людей всё равно, сколько там код и как выполнялся. Им важно время физическое.
И правы, для некоторого кода учет многозадачности - очень важен - я об этом в предыдущем посте писал.
Вообще то человек, если он вменяемый, когда тестирует быстроту кода, не будет запускать в фоне тяжёлой задачи и повторит замеры несколько раз. И что бы выполнить полностью все правила измерений, укажу, что точность GetTickCoutn приблизительно +-26мс на обычном декстопе и до +-70 на серверных вариантах (могут быть и другие, если систему "тюнинговали").
Галочка "подтверждения прочтения" - вселенское зло.
Пупкин В В

Пупкин В В (статус: 2-ой класс), 18 февраля 2009, 12:56 [#10]:

об чем и речь, если код например прожига балванки который в конце показывает затраченное время то GetTickCount; лучший вариант и учет многозадачности - бред. Если человек определяется с разными вариантами одного и того ж кода для определения какой работает быстрее то учет многозадачности очень важен, особенно если код исполняется продолжительное время.
Вадим К

Вадим К (статус: Академик), 18 февраля 2009, 13:37 [#11]:

Ждем ответа вопрошающего. Иначе всё это флейм.
Галочка "подтверждения прочтения" - вселенское зло.
operKOT

operKOT (статус: Посетитель), 18 февраля 2009, 16:17 [#12]:

у меня несколько алгоритмоф шифрования и нужно узнать какой эффективнее/быстрее при одинаковых исходных данных!
Вадим К

Вадим К (статус: Академик), 18 февраля 2009, 16:28 [#13]:

Если алгоритмы не самопальные, то лучше просто почитать соответсвующую литературу.
А так... даете большой объем данных и пусть шифруют. Хотя опять же, что и как шифруется...
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 18 февраля 2009, 16:34 [#14]:

Цитата:

у меня несколько алгоритмоф шифрования и нужно узнать какой эффективнее/быстрее при одинаковых исходных данных!


Так бы сразу и сказал.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:39
Выполнено за 0.03 сек.