| 
| 
 | Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |