Russian Qt Forum
Ноябрь 05, 2024, 10:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Qt и профайлер?!  (Прочитано 11243 раз)
Rakot
Гость
« : Апрель 17, 2008, 23:54 »

Qt 4.3.4 + Eclipse Europa под винду XP.

Програмлю алгоритм на графе(максимальный поток в сети), который находится за время O(n^3).
Как найти можн количество операций, за который находится данный поток в программе ? То есть мне и нужно сравнить за скока операций поток находится в программе с его верхней границей.
З.Ы. пробовал находить по такой схеме

       кол операций = мощность процессора(кол операций / сек)*время нахождения(сек);

Время находил с помощью QTime. Но с количеством до 100 вершин оно пчему то всегда = 0 Обеспокоенный! Следовательно и количество операций = 0! но эт ж не верно! Мб есть какие нить фунции замера наносекунд в Qt или накрайняк WinApi ные??
Жду любых идей!!! Подмигивающий
Записан
Tonal
Гость
« Ответ #1 : Апрель 18, 2008, 07:55 »

Ты количество вершин на порядок увеличь, и не надо будет наносекунды мучить. :-)

P.S. Прикольно ты количество операций считаешь. А это каких операций получается, если вспомнить, про кеши, конвеер, и про то, что плавающая точка может параллельно считаться?
Записан
Lom
Гость
« Ответ #2 : Апрель 18, 2008, 08:42 »

Быстродействие под Win обычно меряют вот так:
Код:
LARGE_INTEGER Freq;
QueryPerformanceFrequency(&Freq);
   
LARGE_INTEGER Start, End;
QueryPerformanceCounter(&Start);
// здесь идут вызовы, скорость которых мы меряем
QueryPerformanceCounter(&End);

cout << " Time: " << (float(End.QuadPart - Start.QuadPart)/Freq.QuadPart) << " second(s)" << endl;
Записан
Sergeich
Гость
« Ответ #3 : Апрель 18, 2008, 10:12 »

Обычно замеряют время работы cpu для данного процесса или потока. Под вынь так:
Код:
#include <windows.h>

double SysInfo::threadCpuTime()
{
__int64 creation64, exit64, kernel64, user64;
int rc = GetThreadTimes (GetCurrentThread (),
                                (FILETIME *) &creation64,
                                (FILETIME *) &exit64,
                                (FILETIME *) &kernel64,
                                (FILETIME *) &user64);
double kernel = 0, user = 0;
if (rc) {
  kernel = kernel64 * 1.0e-7;
  user = user64 * 1.0e-7;
}
return kernel + user;
}
 
double SysInfo::processCpuTime()
{
__int64 creation64, exit64, kernel64, user64;
int rc = GetProcessTimes (GetCurrentProcess (),
                                (FILETIME *) &creation64,
                                (FILETIME *) &exit64,
                                (FILETIME *) &kernel64,
                                (FILETIME *) &user64);
double kernel = 0, user = 0;
if (rc) {
  kernel = kernel64 * 1.0e-7;
  user = user64 * 1.0e-7;
}
return kernel + user;
}
Под линух так:
Код:
#include <unistd.h>
double SysInfo::threadCpuTime()
{
timespec tp;
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp);
return tp.tv_sec + tp.tv_nsec * 1.0e-9;
}
 
double SysInfo::processCpuTime()
{
timespec tp;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tp);
return tp.tv_sec + tp.tv_nsec * 1.0e-9;
}
Время возвращается в секундах
Записан
Rakot
Гость
« Ответ #4 : Апрель 18, 2008, 16:35 »

Быстродействие под Win обычно меряют вот так:
Код:
LARGE_INTEGER Freq;
QueryPerformanceFrequency(&Freq);
   
LARGE_INTEGER Start, End;
QueryPerformanceCounter(&Start);
// здесь идут вызовы, скорость которых мы меряем
QueryPerformanceCounter(&End);

cout << " Time: " << (float(End.QuadPart - Start.QuadPart)/Freq.QuadPart) << " second(s)" << endl;

Делаю так! Вроде время считает правильно. Подмигивающий
А как узнать сколько операций в сек происходит? Мне же нужно не само время, а количество операций, выполняемой функцией за найденное, указанным выше путем, время.
« Последнее редактирование: Апрель 18, 2008, 16:37 от Rakot » Записан
Tonal
Гость
« Ответ #5 : Апрель 19, 2008, 10:37 »

Ты же не ответил каких именно тебе нужно операций. :-)
Записан
Rakot
Гость
« Ответ #6 : Апрель 19, 2008, 13:59 »

Ты же не ответил каких именно тебе нужно операций. :-)

Дык я не знаю каких мне?! Обеспокоенный
Мне нужно узнать сколько операций мой комп делает в сек. И выше я писал, что есть, например, граф на 10 вершин. На его нахождение потребуется не более 1000 итераций(судя по его сложности O(n^3)). Время я нахожу как писал Lom. А вот сколько мой комп тратит итераций на нахождение решения я то и пытаюсь найти по моей формуле.
 
Ну выложи какие ты знаешь(если не трудно), а я уж подберу какие мну подходят.
Записан
Tonal
Гость
« Ответ #7 : Апрель 21, 2008, 11:08 »

Если тебе нужно посчитать итерации - то смотри алгоритм и его реализацию. Мерить время для этого бессмысленно.
Если операции - то смотря что ты под ними понимаешь.
Например операции ассемблера - компилишь всё с ассемиблерным листингом, и считаешь количество командочек. В циклах умножая на количество повторов. Улыбающийся

Ну а что ты будешь с померенным временем делать - я не знаю. Улыбающийся

P.S. Обычно, из алгоритма получают трудоёмкость, а потом замерами времени подтверждают, что реализация ведёт себя не хуже теоретической.
Например, в твоём случае, если трудоёмкость твоего алгоритма O(n**3), то при увеличении n время расчёта должно увеличиваться по кубу.

P.P.S. Возможно тебе что-то вообще не то нужно. Улыбающийся
« Последнее редактирование: Апрель 21, 2008, 11:13 от Tonal » Записан
Rakot
Гость
« Ответ #8 : Апрель 21, 2008, 12:55 »

Мне нужн посчитать количество операций с плавающей точкой в секунду (Floating Operations Per Second, FLOPS, в наше время чаше говорят о Mflops — миллионах операций в секунду), которые может исполнять процессор.

На Qt как нить можн?
Записан
Tonal
Гость
« Ответ #9 : Апрель 21, 2008, 13:50 »

Ну так набери в гугле "как измерить FLOPS" и фтыкай.
Или тебя там забанили? Улыбающийся

Только не понятно, какое это всё отношение к Qt имеет...
Записан
Rakot
Гость
« Ответ #10 : Апрель 21, 2008, 14:36 »

Дык искал вгугле!Не нашел!Поэтому и спрашиваю, мб кто нить уже измерял флопы эти Улыбающийся

Цитировать
Только не понятно, какое это всё отношение к Qt имеет...

Все остальное пишется на Qt.

З.Ы. прост если например флопы как нить через ассемблер ищется, я прост не знаю как его (asm) сконнектить с QT.
Записан
Madgeniy
Гость
« Ответ #11 : Февраль 12, 2011, 20:07 »

Подскажите, пожалуйста один момент.

Код:
  
sysTime = processCpuTime();
process.start(coder,arguments);
 if (process.waitForFinished(-1)) {               
                    sysTime2 = processCpuTime();
 }

sysTime и sysTime2  у меня принимают одинаковые значения. Почему так может происходить?
Записан
Fat-Zer
Гость
« Ответ #12 : Февраль 12, 2011, 20:26 »

первое, что приходит на ум - процесс не запускается(не правильная команда)...
Записан
Madgeniy
Гость
« Ответ #13 : Февраль 12, 2011, 20:36 »

Процесс отрабатывает. Он создает файл, файл создается.
Записан
Fat-Zer
Гость
« Ответ #14 : Февраль 12, 2011, 20:44 »

# не посмотрел на сами функции...
Дык эти функции возвращают время, проведённое в текущем процессе, а оно, само собой =~0
можно попробовать не извращаться с винапи и использовать:
QTime::currentTime ()
QTime::elapsed ()
главное, чтоб разрешения таймера хватило...
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 21.