Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
1

Аппаратный таймер

09.09.2019, 16:35. Показов 2731. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть ли не софтверные таймеры посчитать время выполнения кода внутри интервала 1\60 сек?
Windows XP
Пробовал time.h грузит CPU, chrono.h не смог запустить.
Неужели все они CPU?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2019, 16:35
Ответы с готовыми решениями:

ЭЦП и аппаратный токен
Добрый вечер, форумчане! Помогите, пожалуйста, с задачей или посоветуйте в какую сторону копать: ...

Аппаратный серийный номер флэш накопителя
Здравствуйте! Как можно считать аппаратный серийный номер с флэшки? Функция Getvolumeinformation не...

Аппаратный генератор случайных чисел! SOS
И снова здравствуйте! Продолжаю заниматься аппаратным генератором случайных чисел на основе...

Работа со звуком! (Ошибка) Аппаратный генератор случайных чисел!
Доброго времени суток занимаюсь созданием аппаратного генератора случайных чисел на основе звуковой...

14
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
09.09.2019, 17:01 2
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Есть ли не софтверные таймеры посчитать время выполнения кода внутри интервала 1\60 сек?
::GetTickCount()

Добавлено через 1 минуту
QueryPerformanceCounter
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
09.09.2019, 18:00  [ТС] 3
QueryPerformanceCounter Наверно этот подходит. А нет ли примера заклинаний вызвать таймер парой строк?
Для time.h всего 4 строки и все работает…там же целые простыни текста+ не известно что подключать…
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
09.09.2019, 18:08 4
Лучший ответ Сообщение было отмечено Excalibur921 как решение

Решение

Цитата Сообщение от Excalibur921 Посмотреть сообщение
QueryPerformanceCounter Наверно этот подходит. А нет ли примера заклинаний вызвать таймер парой строк?
C++
1
2
3
4
5
6
7
8
9
10
11
        LARGE_INTEGER StartingTime, EndingTime;
        LARGE_INTEGER Frequency;
 
        QueryPerformanceFrequency(&Frequency);
        QueryPerformanceCounter(&StartingTime);
 
        ::Sleep(1234);
 
        QueryPerformanceCounter(&EndingTime);
        
        std::cout << (EndingTime.QuadPart - StartingTime.QuadPart) * 1000 / Frequency.QuadPart << " ms" << std::endl;
1
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
09.09.2019, 18:30  [ТС] 5
кошмар...
там *.h наверно нужны.
Аппаратный таймер
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
09.09.2019, 18:34  [ТС] 6
А можете сделать простой пример где замеряться время? Наверно там будет просто список *.h из-за юзания кусков Win.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
09.09.2019, 18:36 7
Цитата Сообщение от Excalibur921 Посмотреть сообщение
кошмар...
там *.h наверно нужны.
#include <windows.h>
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
09.09.2019, 19:01  [ТС] 8
Работает . Но он похоже считает тоже тики процессора…он не аппаратный =(.
Сразу 15 % процессора скушал. Фактически тоже что time.h
C++
1
2
3
4
5
6
7
8
9
10
#include <windows.h>
#include "gl/glut.h"
#include <iostream>
using namespace std;
 
QueryPerformanceFrequency(&Frequency); 
QueryPerformanceCounter(&StartingTime); 
// Измеряемый код.
QueryPerformanceCounter(&EndingTime);
cout << (EndingTime.QuadPart - StartingTime.QuadPart) * 1000 / Frequency.QuadPart << " ms" << endl;
Может я алгоритмическую ошибку делаю? Я хотел измерять время выполнения кода внутри одного кадра 3д приложения на OpenGL glut.
Чтобы прикидывать какие модификации кода ускоряют, какие тяжелые т.е. анализ быстродействия.

Но помыкался и похоже нужно вообще убрать все эти таймеры только нагружают CPU…
О Может правильно делать просто ограничение на 60 FPS и добавлять сложность кода внутри кадра пока FPS не начнут падать? Также мне не нравиться вывод шрифта…какой-то он странный…похоже и он лаги добавляет.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
09.09.2019, 19:04 9
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Работает . Но он похоже считает тоже тики процессора…он не аппаратный =(.
Сразу 15 % процессора скушал. Фактически тоже что time.h
Как может получение текущего времени нагружать процессор? У тебя где-то в другом месте проблема.

Добавлено через 33 секунды
Покажи код.
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
09.09.2019, 19:15  [ТС] 10
Максимально простой, движение точки(квадрата особенность opengl) по таймеру каждые 1\60 сек.
13-15% с таймером анализатор просто Диспетчер задач =)
3-4% без
Правда и режим дебаг. Но всеравно...

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <windows.h>
#include "gl/glut.h"
#include <iostream>
//#include <iostream>
//#include <string>
using namespace std;
 
GLfloat x = 0.0f;
 
GLfloat windowWidth;
GLfloat windowHeight;
 
//LARGE_INTEGER StartingTime, EndingTime;
//LARGE_INTEGER Frequency;
 
void RenderScene(void)
    {
x=x+0.2;
/*
//---------------
QueryPerformanceFrequency(&Frequency); //<========
QueryPerformanceCounter(&StartingTime); //<========
//---------------
*/
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 1.0f, 0.0f);
glPointSize(20);
glBegin(GL_POINTS);
glVertex2f(x,0.0f); 
glEnd();
glutSwapBuffers();
/*
//---------------
QueryPerformanceCounter(&EndingTime);//<========
cout << (EndingTime.QuadPart - StartingTime.QuadPart) * 1000 / Frequency.QuadPart << " ms" << endl;
//---------------
*/
}
 
void TimerFunction(int value)
    {
        //=====code
    RenderScene();
    glutPostRedisplay();
    glutTimerFunc(16,TimerFunction, 1);
    }
 
void SetupRC(void)
    {
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    }
void ChangeSize(int w, int h)
    {
    GLfloat aspectRatio;
    if(h == 0)
        h = 1;
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    aspectRatio = (GLfloat)w / (GLfloat)h;
    if (w <= h) 
        {
        windowWidth = 100;
        windowHeight = 100 / aspectRatio;
        glOrtho (-100.0, 100.0, -windowHeight, windowHeight, 1.0, -1.0);
        }
    else 
        {
        windowWidth = 100 * aspectRatio;
        windowHeight = 100;
        glOrtho (-windowWidth, windowWidth, -100.0, 100.0, 1.0, -1.0);
        }
 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }
 
int main(int argc, char* argv[])
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(200,200);
    glutCreateWindow("Bounce");
    glutDisplayFunc(RenderScene);
    glutReshapeFunc(ChangeSize);
    glutTimerFunc(33, TimerFunction, 1);
    SetupRC();
    glutMainLoop();
    return 0;
    }
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
09.09.2019, 19:19 11
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Правда и режим дебаг. Но всеравно...
у тебя std::cout там было, где таймер?

Добавлено через 38 секунд
Вынеси QueryPerformanceFrequency за цикл, оно никогда не меняется

Добавлено через 27 секунд
И не используй там std::cout, это она тормозит

Добавлено через 1 минуту
Ну, и не надо ничего замерять в дебаге, замеряй в релизе
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
09.09.2019, 20:02  [ТС] 12
Наверно внутренне реализован просто подсчет тиков процессора, отсюда и требования
LARGE_INTEGER в которые по сути пишет много раз бесполезного мусора нагружая CPU.

Наверно вот этот правильный, смотря как его сделали, аппаратно или софтверно.
https://docs.microsoft.com/ru-... dia-timers

“The multimedia timer services allow an application to schedule periodic timer events — that is, the application can request and receive timer messages at application-specified intervals.”

Вот если его настроить на отсчеты допустим 100 отсчетов внутри интервала 1\60 сек
то это уже намного меньше должно нагружать CPU. Другое вопрос что это не моего уровня hello world =). Понятия не имею…я вообще незнаю как вы среди тех простыней кода нашли 5 строки ответа.

Добавлено через 7 минут
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
у тебя std::cout там было, где таймер?
Закоментил только строчки для показа отсчета времени.
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
не используй там std::cout, это она тормозит
Кстати…может. А как тогда смотреть переменные?
А как мне нубу смотреть переменные во время запуска?

Добавлено через 6 минут
Вроде как можно писать возле *.h
using namespace std;
и не добовлять его потом…ну то такое.

Значит нужно записывать внутри цикла эти огромные LARGE_INTEGER в другую переменную(выглядит очень странно) затем делить на количество FPS…
ИМХО это неправильное решение. Тут нужен переодический таймер который будет прибавляеть переменную (тикать) внутри временного интервала 1\60 сек например ну раз 1000 или хотяб 100.
Уже будет почти аппаратный замер.

Добавлено через 23 минуты
Может тогда вообще правильно выбросить таймер glut?
По идее этот мультимедиа таймер можно настроить на 1000 тиков внутри 1\60 сек. Тогда вся прога будет читать из одного регистра тики. Насчитали 1000 тиков обновили 1 кадр это 1\60 сек, посчитали количество этих тиков за которое выполнился код получили быстродействие кода. Посчитали 1000*60 получили секунду. Обновили показ FPS. Сразу 3 зайца. Вот только я Хз как собрать это все в кучу.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
09.09.2019, 21:21 13
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Кстати…может. А как тогда смотреть переменные?
А как мне нубу смотреть переменные во время запуска?
Пиши в файл, а ещё лучше выводи их в другом потоке, чтоб не тормозить основной. Как-то надо понимать что работает медленно, а что быстро, если уж взялся.
Тем более, 1/60 секунды, это вообще ни о чём, а ты умудряешься просирать на таймере.

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Наверно внутренне реализован просто подсчет тиков процессора, отсюда и требования
LARGE_INTEGER в которые по сути пишет много раз бесполезного мусора нагружая CPU.
LARGE_INTEGER это 64-битное целое, оно ничего не нагружает, у тебя процессор 64-бита, это его естественный тип.

QueryPerformanceCounter возвращает значение системного счётчика, у которого разрешение QueryPerformanceFrequency в секунду.
Мультимедиа-таймеры вызывают их же и вызывают.
0
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
09.09.2019, 22:12 14
Делал как-то замеры производительности для графики, пару комментариев могу вставить.
1) QueryPerfomance не может съедать так много, он очень быстр.
2) Вывод текста может быть очень накладным, так что практичнее будет использовать лог или отладку.
3) Отдельные графические функции работают асинхронно. Из-за этого некоторые фрагменты кода нет смысла измерять. Другие фрагменты кода могут финализировать рендеринг и осуществлять графический вывод с ожиданием смены кадров. Измерение таких операций то же может не иметь особого смысла.
4) Можно настроить работу графики на неограниченный фреймрейт без вертикальной синхронизации. Да, некоторые кадры будут рендерится в холостую без реального вывода. Зато по реальному фреймрейту можно будет оценить производительность рендеринга.
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
10.09.2019, 20:15  [ТС] 15
Цитата Сообщение от Ygg Посмотреть сообщение
настроить работу графики на неограниченный фреймрейт
Выходит это правильно и проще всего. Значит в этом моя алгоритмическая ошибка, рулит не экстраполяция сколько можно теоретически отрендерить кадров на основе замера времени кода, а сколько получается фактически. Тогда и эти таймеры не нужны.
0
10.09.2019, 20:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2019, 20:15
Помогаю со студенческими работами здесь

Таймер должен через время положить файл на БД. [Таймер]
Мне нужен таймер, а я не знаю как его делать именно, чтоб в конкретное время он сохранял информацию...

Kelogger аппаратный
Здарвствуйте, незнаю сюда надо писать или нет... Короче у меня есть keylogger аппаратный,...

Аппаратный фаервол
Посоветуйте аппаратный фаервол В наличии канал 150 мб сек и 1 гб сек. То есть нужно два разных...

Аппаратный фрайвол
Интересуют аппаратный фрайволы, какой сегодня лидер? Говорят Cisco уже устарел. Что скажите на...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru