|
Вопрос # 2 424/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Требуется посчитать время выполнения функции, от нажатия на кнопку до вывода результата!
 |
Вопрос задал: 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™ (статус: Доктор наук), 18 февраля 2009, 10:04 [#1]:
И всё равно это будет время выполнения функции на фоне выполнения других процессов системы. Система-то многозадачная!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 18 февраля 2009, 10:12 [#2]:
to 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™ (статус: Доктор наук), 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 (статус: Посетитель), 18 февраля 2009, 16:17 [#12]:
у меня несколько алгоритмоф шифрования и нужно узнать какой эффективнее/быстрее при одинаковых исходных данных!
|
|
Вадим К (статус: Академик), 18 февраля 2009, 16:28 [#13]:
Если алгоритмы не самопальные, то лучше просто почитать соответсвующую литературу.
А так... даете большой объем данных и пусть шифруют. Хотя опять же, что и как шифруется...
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 18 февраля 2009, 16:34 [#14]:
Цитата:
у меня несколько алгоритмоф шифрования и нужно узнать какой эффективнее/быстрее при одинаковых исходных данных!
Так бы сразу и сказал.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|