Нужно измерить время работы функции в мс.
Под виндами я использовала QueryPerformanceFrequency и QueryPerformanceCounter. Теперь необходимо написать кроссплатформенную прогу, чтоб работала и под виндами и под линуксом.
Нет ли какого нить аналога в бусте?
Кто-нить подскажите способ!!
Здравствуйте, kazbich, Вы писали:
K>Нужно измерить время работы функции в мс. K>Под виндами я использовала QueryPerformanceFrequency и QueryPerformanceCounter. Теперь необходимо написать кроссплатформенную прогу, чтоб работала и под виндами и под линуксом. K>Нет ли какого нить аналога в бусте? K>Кто-нить подскажите способ!!
Здравствуйте, kazbich, Вы писали:
K>Нужно измерить время работы функции в мс. K>Под виндами я использовала QueryPerformanceFrequency и QueryPerformanceCounter. Теперь необходимо написать кроссплатформенную прогу, чтоб работала и под виндами и под линуксом. K>Нет ли какого нить аналога в бусте? K>Кто-нить подскажите способ!!
Посмотри функцию clock() в time.h, стандартно и кроссплатформенно.
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Здравствуйте, kazbich, Вы писали:
K>Нужно измерить время работы функции в мс. K>Под виндами я использовала QueryPerformanceFrequency и QueryPerformanceCounter. Теперь необходимо написать кроссплатформенную прогу, чтоб работала и под виндами и под линуксом. K>Нет ли какого нить аналога в бусте? K>Кто-нить подскажите способ!!
R>Ну это правда не в мс, а в тактах. Но если для целей логирования и профилирования, то хорошо подходит, т.к. работает быстро и точно.
До тех пор пока его не запустить на каком нибудь ноутбуке с Intel Speed Step или еще че там придумали...
Здравствуйте, Аноним, Вы писали:
R>>Ну это правда не в мс, а в тактах. Но если для целей логирования и профилирования, то хорошо подходит, т.к. работает быстро и точно. А>До тех пор пока его не запустить на каком нибудь ноутбуке с Intel Speed Step или еще че там придумали...
А что будет?
Неужели машинные команды разное количество тактов выполняются?
Здравствуйте, <Аноним>, Вы писали:
А>На 2х ядерных атлонах очень плохо будет, там эти счетчики не синхронизированы между ядрами.
Вообще это проблемы атлонов, т.к. на двуядерных пнях все ок
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, kazbich, Вы писали:
K>Нужно измерить время работы функции в мс. K>Под виндами я использовала QueryPerformanceFrequency и QueryPerformanceCounter. Теперь необходимо написать кроссплатформенную прогу, чтоб работала и под виндами и под линуксом. K>Нет ли какого нить аналога в бусте? K>Кто-нить подскажите способ!!
1. Какнибудь узнать текущее время #1.
2. Вызвать тестируемую ф-цию N раз (N — чем больше, тем лучше. может 100 или 100000)
3. Опять узнать текущее время #2 (тем-же способом)
4. Пощитать время (#2-#1)/N
Подключила #include <boost/timer.hpp>
Объявила boost::timer timer;
Написала
до функции: timer.restart();
после функции: int t1 = timer.elapsed() * 1000;
Я считаю, что t1 после всего этого должен выдавать работу моей функции в мс..
Но изучая свои логи прихожу к выводу что те же замеры сделанные с помощью функций QueryPerformanceFrequency и QueryPerformanceCounter показывают результаты 6 — 8 мс, а с помощью буста в половине случаев подозрительно ровно 16 мс всегда, а в другой половине нули.
Что я не так делаю?
А>>На 2х ядерных атлонах очень плохо будет, там эти счетчики не синхронизированы между ядрами. CC>Вообще это проблемы атлонов, т.к. на двуядерных пнях все ок
Вообще это проблемы разработчика программы. На многопроцессорных машинах тоже работать не будет.
Здравствуйте, kazbich, Вы писали:
K>Я считаю, что t1 после всего этого должен выдавать работу моей функции в мс.. K>Но изучая свои логи прихожу к выводу что те же замеры сделанные с помощью функций QueryPerformanceFrequency и QueryPerformanceCounter показывают результаты 6 — 8 мс, а с помощью буста в половине случаев подозрительно ровно 16 мс всегда, а в другой половине нули. K>Что я не так делаю?
Дело в том, что QueryPerformanceCounter использует аппаратные hires таймеры, тогда как все остальное не-аппаратно-платформозависимое опираются на lores таймеры, предоставляемые ОС. Т.е. у них квант 16 мс.
боюсь самым идеальным решением все же останется asm rdtsc — возвращает счетчик тиков процессора.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, kazbich, Вы писали:
K>Здравствуйте, zaufi, Вы писали:
Z>>boost/timer.hpp Z>>boost/progress.hpp
K>Подключила #include <boost/timer.hpp> K>Объявила boost::timer timer; K>Написала K>до функции: timer.restart(); K>после функции: int t1 = timer.elapsed() * 1000; K>Я считаю, что t1 после всего этого должен выдавать работу моей функции в мс.. K>Но изучая свои логи прихожу к выводу что те же замеры сделанные с помощью функций QueryPerformanceFrequency и QueryPerformanceCounter показывают результаты 6 — 8 мс, а с помощью буста в половине случаев подозрительно ровно 16 мс всегда, а в другой половине нули. K>Что я не так делаю?
Видимо, она работает через GetTickCount(). А она возвращает время квантующееся по 16 мс.
Здравствуйте, Sm0ke, Вы писали:
S>1. Какнибудь узнать текущее время #1. S>2. Вызвать тестируемую ф-цию N раз (N — чем больше, тем лучше. может 100 или 100000) S>3. Опять узнать текущее время #2 (тем-же способом) S>4. Пощитать время (#2-#1)/N
Если так сделать, то можно получить любое время, но не время выполнения функции.
Функция — это не только выполнение инструкций процессором, а общая работа всей системы (контроллеров, шины, памяти и т.д.)
Очевидно, что если ботлнек в медленном доступе к памяти, ты не сможешь это обнаружить, измеряя таким способом, если все данные находятся в кэше.
Re: Как измерить время работы функции?
От:
Аноним
Дата:
15.11.06 09:10
Оценка:
Здравствуйте, kazbich, Вы писали:
K>Нужно измерить время работы функции в мс. K>Под виндами я использовала QueryPerformanceFrequency и QueryPerformanceCounter. Теперь необходимо написать кроссплатформенную прогу, чтоб работала и под виндами и под линуксом. K>Нет ли какого нить аналога в бусте? K>Кто-нить подскажите способ!!
А может проще использовать какой нибудь performance analizer? тот же интеловский, например...