Как измерить время работы функции?
От: kazbich  
Дата: 09.11.06 13:40
Оценка:
Нужно измерить время работы функции в мс.
Под виндами я использовала QueryPerformanceFrequency и QueryPerformanceCounter. Теперь необходимо написать кроссплатформенную прогу, чтоб работала и под виндами и под линуксом.
Нет ли какого нить аналога в бусте?
Кто-нить подскажите способ!!
Re: Как измерить время работы функции?
От: zaufi Земля  
Дата: 09.11.06 14:53
Оценка:
Здравствуйте, kazbich, Вы писали:

K>Нужно измерить время работы функции в мс.

K>Под виндами я использовала QueryPerformanceFrequency и QueryPerformanceCounter. Теперь необходимо написать кроссплатформенную прогу, чтоб работала и под виндами и под линуксом.
K>Нет ли какого нить аналога в бусте?
K>Кто-нить подскажите способ!!

boost/timer.hpp
boost/progress.hpp
Re: Как измерить время работы функции?
От: dr.Chaos Россия Украшения HandMade
Дата: 09.11.06 15:24
Оценка:
Здравствуйте, kazbich, Вы писали:

K>Нужно измерить время работы функции в мс.

K>Под виндами я использовала QueryPerformanceFrequency и QueryPerformanceCounter. Теперь необходимо написать кроссплатформенную прогу, чтоб работала и под виндами и под линуксом.
K>Нет ли какого нить аналога в бусте?
K>Кто-нить подскажите способ!!

Посмотри функцию clock() в time.h, стандартно и кроссплатформенно.
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re: Как измерить время работы функции?
От: remark Россия http://www.1024cores.net/
Дата: 09.11.06 16:40
Оценка:
Здравствуйте, kazbich, Вы писали:

K>Нужно измерить время работы функции в мс.

K>Под виндами я использовала QueryPerformanceFrequency и QueryPerformanceCounter. Теперь необходимо написать кроссплатформенную прогу, чтоб работала и под виндами и под линуксом.
K>Нет ли какого нить аналога в бусте?
K>Кто-нить подскажите способ!!


__declspec(naked) __int64 getTSC()
{
    __asm rdtsc;
    __asm ret;
}



Ну это правда не в мс, а в тактах. Но если для целей логирования и профилирования, то хорошо подходит, т.к. работает быстро и точно.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Как измерить время работы функции?
От: Аноним  
Дата: 09.11.06 16:42
Оценка:
R>Ну это правда не в мс, а в тактах. Но если для целей логирования и профилирования, то хорошо подходит, т.к. работает быстро и точно.
До тех пор пока его не запустить на каком нибудь ноутбуке с Intel Speed Step или еще че там придумали...
Re[3]: Как измерить время работы функции?
От: remark Россия http://www.1024cores.net/
Дата: 09.11.06 16:48
Оценка:
Здравствуйте, Аноним, Вы писали:

R>>Ну это правда не в мс, а в тактах. Но если для целей логирования и профилирования, то хорошо подходит, т.к. работает быстро и точно.

А>До тех пор пока его не запустить на каком нибудь ноутбуке с Intel Speed Step или еще че там придумали...

А что будет?
Неужели машинные команды разное количество тактов выполняются?


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Как измерить время работы функции?
От: Аноним  
Дата: 09.11.06 16:49
Оценка:
R>
R>__declspec(naked) __int64 getTSC()
R>{
R>    __asm rdtsc;
R>    __asm ret;
R>}
R>



R>Ну это правда не в мс, а в тактах. Но если для целей логирования и профилирования, то хорошо подходит, т.к. работает быстро и точно.


На 2х ядерных атлонах очень плохо будет, там эти счетчики не синхронизированы между ядрами.
Re[3]: Как измерить время работы функции?
От: CreatorCray  
Дата: 10.11.06 07:21
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>На 2х ядерных атлонах очень плохо будет, там эти счетчики не синхронизированы между ядрами.

Вообще это проблемы атлонов, т.к. на двуядерных пнях все ок
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re: Как измерить время работы функции?
От: Sm0ke Россия ksi
Дата: 10.11.06 09:22
Оценка:
Здравствуйте, kazbich, Вы писали:

K>Нужно измерить время работы функции в мс.

K>Под виндами я использовала QueryPerformanceFrequency и QueryPerformanceCounter. Теперь необходимо написать кроссплатформенную прогу, чтоб работала и под виндами и под линуксом.
K>Нет ли какого нить аналога в бусте?
K>Кто-нить подскажите способ!!

1. Какнибудь узнать текущее время #1.
2. Вызвать тестируемую ф-цию N раз (N — чем больше, тем лучше. может 100 или 100000)
3. Опять узнать текущее время #2 (тем-же способом)
4. Пощитать время (#2-#1)/N
Re[2]: Как измерить время работы функции?
От: kazbich  
Дата: 10.11.06 13:33
Оценка:
Здравствуйте, zaufi, Вы писали:


Z>boost/timer.hpp

Z>boost/progress.hpp

Подключила #include <boost/timer.hpp>
Объявила boost::timer timer;
Написала
до функции: timer.restart();
после функции: int t1 = timer.elapsed() * 1000;
Я считаю, что t1 после всего этого должен выдавать работу моей функции в мс..
Но изучая свои логи прихожу к выводу что те же замеры сделанные с помощью функций QueryPerformanceFrequency и QueryPerformanceCounter показывают результаты 6 — 8 мс, а с помощью буста в половине случаев подозрительно ровно 16 мс всегда, а в другой половине нули.
Что я не так делаю?
Re[4]: Как измерить время работы функции?
От: LelicDsp Россия  
Дата: 10.11.06 14:10
Оценка:
А>>На 2х ядерных атлонах очень плохо будет, там эти счетчики не синхронизированы между ядрами.
CC>Вообще это проблемы атлонов, т.к. на двуядерных пнях все ок
Вообще это проблемы разработчика программы. На многопроцессорных машинах тоже работать не будет.
Re[3]: Как измерить время работы функции?
От: CreatorCray  
Дата: 10.11.06 14:13
Оценка:
Здравствуйте, 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, значит пора закрыть эту страницу.
Всем пока
Re[3]: Как измерить время работы функции?
От: remark Россия http://www.1024cores.net/
Дата: 13.11.06 10:37
Оценка:
Здравствуйте, 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 мс.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Как измерить время работы функции?
От: x0ras  
Дата: 13.11.06 14:41
Оценка:
Здравствуйте, 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? тот же интеловский, например...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.