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 даже код привел
Отредактировано 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
|
вопрос отвалился сам собой
естественно, в первую очередь зависит от того, зачем.
|
|