Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 10.01.2010
Сообщений: 6
1

Время выполнения процедуры в С++ 3.1

10.01.2010, 23:40. Показов 4419. Ответов 12
Метки нет (Все метки)

Столкнулся с проблемой. Нужно подсчитать за сколько тактов процессора(времени) выполняется код процедуры. Стандартные функции С++ выдают значение 0 , а из исходников на ассемблере из инета ничего не компилируется. Может кто знает в чем проблема?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.01.2010, 23:40
Ответы с готовыми решениями:

Время выполнения процедуры
Как вычислить время выполнения процедуры? Добавлено через 5 минут Точнее даже продолжительность...

Время выполнения процедуры
Здравствуйте, У меня есть процедура в mssql. Она выполняет кучу действий с огромным количеством...

Найти время выполнения процедуры
Используя О- символику, найдите время выполнения (как функции от N) процедуры или функции в...

Нужно засечь время выполнения процедуры
писал вот код form1.timer.enabled:=true; search; form1.timer.enabled:=false;Код таймера...

12
Эксперт С++
2341 / 1714 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
10.01.2010, 23:47 2
Лучший ответ Сообщение было отмечено как решение

Решение

Чем пробовали мерить конкретно?
Смотрите в сторону функции Win32 API GetThreadTimes.
Пример ниже.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
_int64 FileTimeToQuadWord(PFILETIME pft)
{
    return(Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}
 
void PerformLongOperation ()
{
    FILETIME ftKernelTimeStart, ftKernelTimeEnd; 
    FILETIME ftUserTimeStart, ftUserTimeEnd; 
    FILETIME ftDummy;
 
    _int64 qwKernelTimeElapsed, qwUserTimeElapsed, qwTotalTimeElapsed;
 
    // получаем начальные показатели времени 
    GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy,
                   &ftKernelTimeStart, &ftUserTimeStart);
 
    // здесь выполняем сложный алгоритм 
 
    // получаем конечные показатели времени
    GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy,
                   &ftKernelTimeEnd, &ftUserTimeEnd);
 
    // получаем значении времени, затраченного на выполнение ядра и User, 
    // преобразуя начальные и конечные показатели времени из FILETIME 
    // в учетверенные слова, а затем вычитая начальные показатели из конечных 
    qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd) -
                          FileTimeToQuadWord(&ftKernelTimeStart);
 
    qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTimeEnd) -
                        FileTimeToQuadWord(&ftUserTimeStart);
 
    // получаем общее время, складывая время выполнения ядра и User 
    qwTotalTimeElapsed = qwKernelTimeElapsed + qwUserTimeElapsed;
 
    // общее время хранится в qwTotalTimeElapsed
 
}
3
0 / 0 / 0
Регистрация: 10.01.2010
Сообщений: 6
10.01.2010, 23:59  [ТС] 3
измерял clock() из time.h и gettime(), результат то же


вот то что я делал

C++
1
2
3
4
5
6
7
8
9
10
clock_t start, finish;
    double  duration;
        
   start = clock();
 
    //сортировка выбором
   finish = clock();
   duration = (double)(finish - start);
   cout<<duration;
   getch();
может тут что то не так?)

Добавлено через 54 секунды
Компилятор вообще не знает типа int64((((((
0
Эксперт С++
2341 / 1714 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
11.01.2010, 00:06 4
Попробуй использовать вышеуказанный способ.
0
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
11.01.2010, 00:07 5
Для конвертирования в секунды значение, полученное clock'ом, делят на CLOCKS_PER_SEC. Но если операция происходит достаточно быстро, то результат все равно будет около нуля, поэтому можно сделать несколько экпериментов, затем высчитать среднее время.
0
0 / 0 / 0
Регистрация: 10.01.2010
Сообщений: 6
11.01.2010, 00:12  [ТС] 6
я ж говорю, что компилятор даже на int64 матюкается, не говоря что в дальнейшем.

да, процедура происходит быстро и значение равно 0 постоянно,а мне надо сделать сравнение методов сортировки
0
Эксперт С++
2341 / 1714 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
11.01.2010, 00:12 7
Использование clock и GetTickCount не дает реальных результатов времени выполнения алгоритма.
А насчет _int64 попробуй заменить на long long int.
0
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
11.01.2010, 00:15 8
Автор упомянул про C++ 3.1 (видимо старый досовский борланд), там еще не было long long int.
0
0 / 0 / 0
Регистрация: 10.01.2010
Сообщений: 6
11.01.2010, 00:27  [ТС] 9
этот код явно не для С++ 3.1. функция Int64ShllMod32 - неизвестна,в хелпе даже похожего нет и еще 15 подобных ошибок.(((

Добавлено через 46 секунд
а long long int есть)

Добавлено через 3 минуты
может это значение через ассемблер вытянуть?

Добавлено через 4 минуты
function RDTSC: int64; assembler;
asm
db $0F,$31 // RDTSC
end;

нашел такую функцию на паскале, как перевести на С++, подскажите пожалуйста
0
MCSD: APP BUILDER
8793 / 1072 / 104
Регистрация: 17.06.2006
Сообщений: 12,603
11.01.2010, 01:40 10
нашел такую функцию на паскале, как перевести на С++, подскажите пожалуйста

Borland C++ 3.1 не поддерживает 32-разрядные регистры, так что прямой перевод невозмжен
только через отдельный asm-модуль
0
0 / 0 / 0
Регистрация: 03.01.2010
Сообщений: 14
11.01.2010, 03:05 11
у меня сработал код который дал автор поста(выдавал значения отличные от 0), но это было днем, вечером же(точнее уже ночь) в другой программе этот же код выдает нули...
Работал в таков варианте
Код
#include <time.h>
// обьявление
clock_t start, finish;
long double duration;
// Начало времени 
start = clock();
// Конец времени
finish = clock();
//Переводим такты в секунды и печатаем
duration = (long double)(finish - start)/CLOCKS_PER_SEC;
printf("\n");
printf("Время выполнения: %lf", duration);
0
2534 / 830 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
11.01.2010, 04:18 12
Цитата Сообщение от Rififi Посмотреть сообщение
Borland C++ 3.1 не поддерживает 32-разрядные регистры, так что прямой перевод невозмжен
только через отдельный asm-модуль
Только вот самому процессору как-то все равно какой компилятор делал этот код. Если заставить его выполнить эти 2 байта (0x0F,0x31), то он вернет количество тактов. А вот как подсунуть эти 2 байта... тут уж извините
0
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
11.01.2010, 06:55 13
Цитата Сообщение от Zhenyaxxx Посмотреть сообщение
а long long int есть)
Угу, а еще есть long long long int, short short int и некоторые другие вариации, которые BC++ 3.1 спокойно хавает.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.01.2010, 06:55

Измерить время выполнения определённой процедуры
необходимо измерить время выполнения определённой процедуры, т.к. компьютеры нынче не слабые, то...

Блокирование файла с общим доступом на время выполнения процедуры
Собственно, как заблокировать файл? Есть книга с общим доступом. Пользователь вызывает форму,...

Не могу отобразить окно Splash во время выполнения процедуры MainForm.OnCreate
собственно говоря такая проблема. Не могу отобразить окно Splash во время выполнения процедуры...

Используя О- символику, найдите время выполнения (как функции от N) процедуры или функции в наихудшем случае
Используя О- символику, найдите время выполнения (как функции от N) процедуры или функции в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru