Название: QTime vs rdtsc() ? или QTime vs QTime? Отправлено: Белый пони от Июль 06, 2010, 13:55 Какому из этих способов измерения верить?
Вот функция rdtsc() ( подсмотрено тут - http://www.iakovlev.org/index.html?p=536) Код: extern __inline__ uint64_t rdtsc() { Соответственно, для измерения интервала времени используется следующая конструкция: Код: ini = rdtsc(); ,где MHz - частота процессора. Используя эту штуку, я контролирую частоту оборотов цикла в thread'е: Код: void myThread::run() Мне надо, чтобы цикл while выполнялся 10 раз в секунду (за это время 80 раз выполняется цикл for). То есть после выполнения 8-ми оборотов цикла for я жду пока "натикает" до 0.1 секунды. Быстродействия хватает с головой. Проблемы начались, когда я начал с каждым оборотом while выводить в файл время QTime с миллисекундами. Согласно этому времени, период цикла while был не 100 мс, а примерно 120 мс. Кому больше верить QTime или rdtsc(), по кому из них синхронизировать цикл? Кто, вообще, может что-нибудь сказать про стабильность rdtsc() ? Название: Re: QTime vs rdtsc() ? Отправлено: vipet от Июль 06, 2010, 18:09 Сделать большое кол-во циклов и засечь с секундомером. Название: Re: QTime vs rdtsc() ? Отправлено: kuzulis от Июль 06, 2010, 18:35 Имхо, точнее rdtsc
Хотя, по факту все будет зависеть от загруженности процессора. т.е. не факт что твои функции/операторы в потоке (run) будут выполняться "равномерно". т.е. все-равно каждый раз будет у тебя какая-то ошибка в измерении. Как вариант - дать потоку наивысший приоритет. Хотя, измерение на PC интервалов времени точнее 100 +/- 50 мс дохлое дело. Имхо. Название: Re: QTime vs rdtsc() ? Отправлено: Белый пони от Июль 07, 2010, 20:04 Да, похоже QTime по-лучше в данном случае.
Спасибо за ответы :) Название: Re: QTime vs rdtsc() ? или QTime vs QTime? Отправлено: Белый пони от Июль 13, 2010, 09:21 Что-то я ваще запутался. Похоже в ошибке виноват не rdtsc().
В приведённом выше примере заменил задержку Код: if( j == 7) на Код: if( j == 7) Результат одинаковый. Суть: имеется два thread'а в одном данные считываются с внешнего устройства, при каждом считываении испускается сигнал. В другом thread'е при получении сигнала эти данные записываются в файл; в каждом из thread'ов свой экземпляр QTime. Так вот интервалы измерянные этими QTime'ами не совпадают. То есть если данные считываются раз в 100 мс (согласно таймеру в одном п-ссе), то в файл они записываются раз в примерно 120 мс (согласно таймеру в другом процессе). (аналогично было, когда в считывающем процессе задержка выполнялась с помощью rdtsc() ) Как же так? :) Название: Re: QTime vs rdtsc() ? или QTime vs QTime? Отправлено: kuzulis от Июль 13, 2010, 09:34 Цитировать Хотя, по факту все будет зависеть от загруженности процессора. т.е. не факт что твои функции/операторы в потоке (run) будут выполняться "равномерно". т.е. все-равно каждый раз будет у тебя какая-то ошибка в измерении. Как вариант - дать потоку наивысший приоритет. Хотя, измерение на PC интервалов времени точнее 100 +/- 50 мс дохлое дело. Имхо. Бросьте это дело. Не получите вы то что нужно. Отмерять промежутки времени большой точности на PC и ОС типа Windows или Linux не получится. Для этого нужна хотя-бы ОСРВ или MSDOS. :) Название: Re: QTime vs rdtsc() ? или QTime vs QTime? Отправлено: Белый пони от Июль 13, 2010, 11:21 Бросьте это дело. Не получите вы то что нужно. Отмерять промежутки времени большой точности на PC и ОС типа Windows или Linux не получится. Сурово( У меня глобальная задача как раз написать софт, который есть в ДОСе для линукса. Думал при правильном подходе линух ни в чём не уступает, а тут такое :)))Для этого нужна хотя-бы ОСРВ или MSDOS. :) Название: Re: QTime vs rdtsc() ? или QTime vs QTime? Отправлено: BRE от Июль 13, 2010, 11:57 Сурово( У меня глобальная задача как раз написать софт, который есть в ДОСе для линукса. Думал при правильном подходе линух ни в чём не уступает, а тут такое :))) А при правильном подходе он и не уступает. :)Те подходы к программированию, которые были в ДОСе, никак не могут применяться при программировании в многозадачных системах. Поэтому, организация таких задержек в большинстве современных ОС корректно работать не будут. Название: Re: QTime vs rdtsc() ? или QTime vs QTime? Отправлено: Белый пони от Июль 13, 2010, 12:40 А при правильном подходе он и не уступает. :) Те подходы к программированию, которые были в ДОСе, никак не могут применяться при программировании в многозадачных системах. Поэтому, организация таких задержек в большинстве современных ОС корректно работать не будут. Насклько я понял в возможности выполнения точных задержек уступает :) Или есть другой способ? Название: Re: QTime vs rdtsc() ? или QTime vs QTime? Отправлено: BRE от Июль 13, 2010, 12:53 Насклько я понял в возможности выполнения точных задержек уступает :) Не стоит забывать, что в отличии от DOS, на современных системах параллельно выполняются множество процессов. Поэтому, например, ты запустил цикл ожидания в своем процессе (что само по себе жутко не эффективно и жрет максимум процессорного времени), а ОС переключилась на выполнение другого процесса (более важного) и этот процесс работал 500 тактов, после переключения на твой процесс ты обнаружишь, что задержка составила больше 500 тактов. |