C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как определить время роботы цикла, clock() не подходит
Mythos
  Отправлено: 16.11.2003, 18:47


Ученик-кочегар

Группа: Участник
Сообщений: 28



Подскажите плиз как подсчитать время работы цикла, clock() не подходит при последующих вызовах выдает какие-то ексепшены и аксес виолейшен.
Георгий
Отправлено: 16.11.2003, 19:23


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



никогна он никакие exception не давал — это не он.
для коротких циклов можно считывать число тактов инструкцией rdtsc
CODE

__int64 GetCPUClock(void)
      {
      unsigned long a,b;
      asm     {
              rdtsc;
              mov a,eax;
              mov b,edx;
              };
      __int64 ret;
      ((unsigned long*)&ret)[0]=a;
      ((unsigned long*)&ret)[1]=b;
      return ret;
      };
Nimble
Отправлено: 16.11.2003, 19:31


Дежурный стрелочник

Группа: Участник
Сообщений: 34



Или timeGetTime()
Mythos
  Отправлено: 16.11.2003, 23:04


Ученик-кочегар

Группа: Участник
Сообщений: 28



На самом деле мне нужно получить продолжительность работы цикла в секундах чтобы вывести их как текст, а точнее числовое значение секунд, в TEdit например.
А как вывести __int64(UINT) или преобразовать его в текст?
Георгий
Отправлено: 17.11.2003, 00:58


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



У AnsiString есть конструктор для типа __int64:
AnsiString str;
__int64 a;
str=a;//вот и всё преобразонание в текст
Но, если хочешь в секундах, то используй timeGetTime(). rdtsc возвращает число тактов процессора, которые в секунды впринципе можно перевести, но приэтом точность упадёт до такой же (по крайней мере погрешность будет одного порядка), что и у timeGetTime, поэтому смысла использовать rdtsc для вывода времени в секундах не имеет смысла.
Mythos
  Отправлено: 17.11.2003, 02:08


Ученик-кочегар

Группа: Участник
Сообщений: 28



Я попробовал, можно сказать получилось преобразование...
но во что?
вышло 14 розрядное число?!
И что с ним делать?
Приблизительное время вышло ~1.5 секунди — на часах, для того что-бы получить програмно нужно это 14 розрядное разделить на тринадцать "нулей".
Может нужно еще какое-то преобразование?
Георгий
Отправлено: 17.11.2003, 09:50


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



оно возвращает число считанное из внутреннего счётчика процессора, который увеличивается на 1 каждый такт центрального процессора.
10^14/1.5=~66 000 GHz — таких процессоров ещё не делают
использовать надо так:
CODE
__int64 before,after;
before=GetCPUClock();
longTimeFunction();
after=GetCPUClock();
Edit1->Text=after-before;


Ещё раз повторюсь — это не время — это такты
процессор в 500MHz за 1 секунду увеличивает этот счётчик на 500 000 000

Отредактировано Георгий — 17/11/2003, 10:58
Asher
Отправлено: 17.11.2003, 11:56


Мастер участка

Группа: Модератор
Сообщений: 550



Воспользуйся GetTickCount();
Возвращает unsigned long число в мСек с момента запуска операционки.
Перед циклом запоминаешь число. После цикла вычитаешь запомненное из текущего. Получаешь время в мСек. /1000 в Сек, етс

P.S. Вот ниже exp даже код привел biggrin.gif

Отредактировано Asher — 18/11/2003, 11:42
exp
Отправлено: 17.11.2003, 21:45


Мастер участка

Группа: Участник
Сообщений: 304



CODE

//....
DWORD Start=GetTickCount()  // загоним сюда начальное кол-во тиков
// Здесь
// твои
// действия

Edit1->Text=IntToStr((GetTickCount()-start)/1000); //по разности кол-ва  тиков определяем время и выводим


Mythos
  Отправлено: 20.11.2003, 00:54


Ученик-кочегар

Группа: Участник
Сообщений: 28



2Георгий
1.5 секунды это время на моих часах, то есть цикл работал ~1.5 секунды
2Asher
Понял, спасибо за помощь
2exp
Все работает!

2All
Большой Thanks!
И тему, думаю, можно закрывать!?

Отредактировано Mythos — 20/11/2003, 02:01
Владислав
Отправлено: 26.02.2004, 21:55


Не зарегистрирован







Закрывать рано, есть еще способ...
olegenty
Отправлено: 27.02.2004, 11:52


Ветеран

Группа: Модератор
Сообщений: 2412



Я так делал:
TDateTime tBefore = Now();
<цикл>
TDateTime tAfter = Now();

AnsiString asResult = TimeToStr(tAfter-tBefore);
или без tAfter:
AnsiString asResult = TimeToStr(Now()-tBefore);

и никаких тактов...
хотя, при переходе через полночь нужна дополнительная проверка.

Георгий
Отправлено: 27.02.2004, 13:14


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



olegenty
если речь идёт об измерении больших интервалов — минуты, часы и т.д. то, действительно, Now() и им подобные очень хороши, но когда нужно точное время (например для оптимизации на скорость) то ничего лучше rdtsc нет. Вопрос этой темы я и воспринял как появившийся в процессе оптимизации программы на скорость, поэтому и предложил считывать значение из счётчика тактов процессора.
olegenty
Отправлено: 27.02.2004, 15:25


Ветеран

Группа: Модератор
Сообщений: 2412



вопрос отвалился сам собой smile.gif
естественно, в первую очередь зависит от того, зачем.

Вернуться в Вопросы программирования в C++Builder