crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

5 страниц V  < 1 2 3 4 > »   
Ответить в данную темуНачать новую тему
> Как определить скорость передвижения выполнения кода в мс?, Передвижения линии в мс
zuze
  опции профиля:
сообщение 30.1.2013, 11:33
Сообщение #11


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(sidsukana @ 30.1.2013, 11:02) *
Что за первое второе третье и четвертое? вам нужно только elapsed() - возвращает время в мс прошедшее после вызова start().


У меня вертикальная линия передвигаеться по горизонтали до тех пор пока я не останавлю. От точки до точки передвижение идёт со скоростью 50 миллисекунд или 0.05 секунд. Наверно надо обнулять таймер или делить на количество отрезков пройденной линией.

Цитата(sidsukana @ 30.1.2013, 11:02) *
возвращает время в мс прошедшее после вызова start().


А в каких единицах возвращает?

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 30.1.2013, 11:46
Сообщение #12


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

Спасибо сказали: 10 раз(а)




Репутация:   2  


http://doc.qt.digia.com/qt/qtime.html#elapsed

int в миллисекундах.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 31.1.2013, 7:45
Сообщение #13


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Решил замерить так:

Глобально объявил

uint start;


Где запускаю таймер линии делаю

start = GetTickCount();


После перерисовки линии, то есть update()

if (static_cast<int>(MyRadianToGradus(phi)+0.5) == 360)
   qDebug() << GetTickCount() - start;


Начал показывать значения, но почему-то не точные, буду разбираться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 31.1.2013, 10:06
Сообщение #14


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Дело в том, что у меня линия сдвигается от 0 до 720. Каждый раз идёт сдвиг на 6 градусов, только в прямоугольных координатах. Получается, полностью линия пройдёт за 120 сдвигов.
Следовательно надо в таймере (0.05*1000) / 120. Но это значение меньше 1 мс. Но на 120 сдвиге будет равна 50.

1. Может быть интервал времени каждого сдвига меньше 1 мс и из-за этого неправильные результаты показывает?
2. Если да, то что с этим делать?

Сообщение отредактировал zuze - 31.1.2013, 10:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 31.1.2013, 10:50
Сообщение #15


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

Спасибо сказали: 10 раз(а)




Репутация:   2  


Если ты каждый сдвиг измеряешь, а так как значение меньше 1мс и выведет 0, то само собой сумма нулей равна нулю)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 31.1.2013, 10:53
Сообщение #16


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(sidsukana @ 31.1.2013, 10:50) *
Если ты каждый сдвиг измеряешь, а так как значение меньше 1мс и выведет 0, то само собой сумма нулей равна нулю)


Что удивительно значение не 0, а 800 с чем то или около 800. Почему так, не могу понять?

Как я узнал функция GetTickCount() имеет очень большую погрешность 10 миллисекунд. Может использовать "QueryPerformanceCounter"? Вроде это очень точное определени.

Сообщение отредактировал zuze - 31.1.2013, 11:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sidsukana
  опции профиля:
сообщение 31.1.2013, 11:29
Сообщение #17


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

Спасибо сказали: 10 раз(а)




Репутация:   2  


В C++11 есть модуль chrono для точного измерения времени
http://stackoverflow.com/questions/1487695...esolution-timer вот примеры работ
Но это С++11 нет гарантий что ваш компилятор поддерживает его.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.1.2013, 12:32
Сообщение #18


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


zuze, такие точности в одном цикле не посчитаешь. Делай 1000 полных циклов сдвига, замеряй общее время, потом дели на 1000

при этом можно обойтись простым секундомером или секундной стрелкой на простых часах :)

Цитата
Как я узнал функция GetTickCount() имеет очень большую погрешность 10 миллисекунд.

а это чушь - функция возвращает счётчик тиков с начала включения системы, при чём тут какая-то погрешность ? Другое дело, что вызывать из обычного потока со слипами её получится с не очень точным периодом - порядка 10...16мс

и ещё вопрос - зачем делается это измерение ? Это важный вопрос )

Сообщение отредактировал Алексей1153 - 31.1.2013, 12:31
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 31.1.2013, 13:17
Сообщение #19


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 31.1.2013, 12:32) *
и ещё вопрос - зачем делается это измерение ? Это важный вопрос )


Это важный вопрос, так как у меня начальная скорость 0.05 секунды до 10 секунд. Всё что от 0.5 секунды я могу определить на глаз, а остальное к сожалению нет.

Глобальные переменные

LARGE_INTEGER timerFrequency, timerStart, timerStop;
int timerdelete = 0;


Где запускаю таймер линии делаю

QueryPerformanceFrequency(&timerFrequency);
QueryPerformanceCounter(&timerStart);


После перерисовки линии, то есть update()

if (static_cast<int>(MyRadianToGradus(phi)+0.5) == 360)
{
  QueryPerformanceCounter(&timerStop);
  double const t( static_cast<double>((timerStop.QuadPart - timerStart.QuadPart) / timerFrequency.QuadPart) / timerdelete);
  qDebug() << t;
  timerdelete++;
}


Я устанавливаю таймер 2 секунды и вот какие значения выводятся, после того как линия пройдёт оборот:

1
1
1
1.25
1.2
1.16667
1.28571
1.25
1.22222
1.2
1.27273
1.25
1.23077
1.28571
1.26667
1.25
1.29412
1.27778
1.26316
1.3
1.28571
1.27273
1.30435
1.29167
1.28
1.26923
1.2963
1.28571
1.27586
1.3
1.29032
1.28125
1.30303
1.29412
1.28571
1.30556
1.2973
1.28947
1.30769
1.3
1.29268
1.28571
1.30233
1.29545
1.28889
1.30435
1.29787
1.29167
1.30612
1.3
1.29412
1.30769
1.30189
1.2963
1.29091
1.30357
1.29825
1.2931
1.30508
1.3
1.29508
1.30645
1.30159
1.29688
1.30769
1.30303
1.29851
1.30882
1.30435
1.3
1.29577
1.30556
1.30137
1.2973
1.30667
1.30263
1.2987
1.30769
1.3038
1.3
1.30864
1.30488
1.3012
1.30952
1.30588
1.30233
1.29885
1.30682
1.30337
1.3
1.30769
1.30435
1.30108
1.30851
1.30526
1.30208
1.30928
1.30612
1.30303
1.3
1.30693
1.30392
1.30097
1.30769
1.30476
1.30189
1.30841
1.30556
1.30275
1.30909
1.30631
1.30357
1.30088
1.30702
1.30435
1.30172
1.30769
1.30508
1.30252
1.30833
1.30579
1.30328
1.30894
1.30645
1.304
1.30952
1.30709
1.30469
1.30233
1.30769
1.30534
1.30303
1.30827
1.30597
1.3037
1.30882
1.30657
1.30435
1.30935
1.30714
1.30496
1.30986
1.30769
1.30556
1.31034



Такие значения возможны при задании таймера 2 секунды, если да то почему?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.1.2013, 13:34
Сообщение #20


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


1) повторю попрос - зачем делается такое точное задание скорости и зачем скорость измеРяется ?

От первого ответа зависит то, как будет задаваться эта скорость.

2) Что там за абстрактная такая линия - я до сих пор не знаю )) Что она у тебя делает - тоже.

3) Если так важна точная скорость, то перерисовка не должна иметь приоритет, а должна случаться когда это возможно.

4) с учётом пункта 3 - лог вывода времени, полученный в процедуре отрисовки, не имеет смысла
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

5 страниц V  < 1 2 3 4 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.5.2024, 9:06