Russian Qt Forum

Qt => Общие вопросы => Тема начата: Rakot от Апрель 17, 2008, 23:54



Название: Qt и профайлер?!
Отправлено: Rakot от Апрель 17, 2008, 23:54
Qt 4.3.4 + Eclipse Europa под винду XP.

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

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

Время находил с помощью QTime. Но с количеством до 100 вершин оно пчему то всегда = 0 :-[! Следовательно и количество операций = 0! но эт ж не верно! Мб есть какие нить фунции замера наносекунд в Qt или накрайняк WinApi ные??
Жду любых идей!!! ;)


Название: Re: Qt и профайлер?!
Отправлено: Tonal от Апрель 18, 2008, 07:55
Ты количество вершин на порядок увеличь, и не надо будет наносекунды мучить. :-)

P.S. Прикольно ты количество операций считаешь. А это каких операций получается, если вспомнить, про кеши, конвеер, и про то, что плавающая точка может параллельно считаться?


Название: Re: Qt и профайлер?!
Отправлено: Lom от Апрель 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;


Название: Re: Qt и профайлер?!
Отправлено: Sergeich от Апрель 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;
}
Время возвращается в секундах


Название: Re: Qt и профайлер?!
Отправлено: Rakot от Апрель 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;

Делаю так! Вроде время считает правильно. ;)
А как узнать сколько операций в сек происходит? Мне же нужно не само время, а количество операций, выполняемой функцией за найденное, указанным выше путем, время.


Название: Re: Qt и профайлер?!
Отправлено: Tonal от Апрель 19, 2008, 10:37
Ты же не ответил каких именно тебе нужно операций. :-)


Название: Re: Qt и профайлер?!
Отправлено: Rakot от Апрель 19, 2008, 13:59
Ты же не ответил каких именно тебе нужно операций. :-)

Дык я не знаю каких мне?! :-[
Мне нужно узнать сколько операций мой комп делает в сек. И выше я писал, что есть, например, граф на 10 вершин. На его нахождение потребуется не более 1000 итераций(судя по его сложности O(n^3)). Время я нахожу как писал Lom. А вот сколько мой комп тратит итераций на нахождение решения я то и пытаюсь найти по моей формуле.
 
Ну выложи какие ты знаешь(если не трудно), а я уж подберу какие мну подходят.


Название: Re: Qt и профайлер?!
Отправлено: Tonal от Апрель 21, 2008, 11:08
Если тебе нужно посчитать итерации - то смотри алгоритм и его реализацию. Мерить время для этого бессмысленно.
Если операции - то смотря что ты под ними понимаешь.
Например операции ассемблера - компилишь всё с ассемиблерным листингом, и считаешь количество командочек. В циклах умножая на количество повторов. :)

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

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

P.P.S. Возможно тебе что-то вообще не то нужно. :)


Название: Re: Qt и профайлер?!
Отправлено: Rakot от Апрель 21, 2008, 12:55
Мне нужн посчитать количество операций с плавающей точкой в секунду (Floating Operations Per Second, FLOPS, в наше время чаше говорят о Mflops — миллионах операций в секунду), которые может исполнять процессор.

На Qt как нить можн?


Название: Re: Qt и профайлер?!
Отправлено: Tonal от Апрель 21, 2008, 13:50
Ну так набери в гугле "как измерить FLOPS" и фтыкай.
Или тебя там забанили? :)

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


Название: Re: Qt и профайлер?!
Отправлено: Rakot от Апрель 21, 2008, 14:36
Дык искал вгугле!Не нашел!Поэтому и спрашиваю, мб кто нить уже измерял флопы эти :)

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

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

З.Ы. прост если например флопы как нить через ассемблер ищется, я прост не знаю как его (asm) сконнектить с QT.


Название: Re: Qt и профайлер?!
Отправлено: Madgeniy от Февраль 12, 2011, 20:07
Подскажите, пожалуйста один момент.

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

sysTime и sysTime2  у меня принимают одинаковые значения. Почему так может происходить?


Название: Re: Qt и профайлер?!
Отправлено: Fat-Zer от Февраль 12, 2011, 20:26
первое, что приходит на ум - процесс не запускается(не правильная команда)...


Название: Re: Qt и профайлер?!
Отправлено: Madgeniy от Февраль 12, 2011, 20:36
Процесс отрабатывает. Он создает файл, файл создается.


Название: Re: Qt и профайлер?!
Отправлено: Fat-Zer от Февраль 12, 2011, 20:44
# не посмотрел на сами функции...
Дык эти функции возвращают время, проведённое в текущем процессе, а оно, само собой =~0
можно попробовать не извращаться с винапи и использовать:
QTime::currentTime ()
QTime::elapsed ()
главное, чтоб разрешения таймера хватило...


Название: Re: Qt и профайлер?!
Отправлено: Madgeniy от Февраль 13, 2011, 14:07
Понял. Как тогда можно посчитать кроме как с помощью таймера? Надо узнать сколько именно времени уделяется самой программе создания файла. У меня архивация происходит, надо только ее время знать в user space.


Название: Re: Qt и профайлер?!
Отправлено: Fat-Zer от Февраль 13, 2011, 14:13
ну ум приходят те же самые шаманства с винапи, только передавать GetProcessTimes () хендлер дочернего процесса.


Название: Re: Qt и профайлер?!
Отправлено: Madgeniy от Февраль 13, 2011, 15:13
Да. QProcess::pid() видимо, мне в помощь. Однако это только pid рабочего процесса. Процесс высылает сигнал finished и только потом я могу посчитать время, однако в этом время он уже закончит свою работу и результат будет неопределен.