Russian Qt Forum

Qt => Вопросы новичков => Тема начата: shtrix от Март 25, 2016, 00:38



Название: Как измерить время (скорость) выполнения функции
Отправлено: shtrix от Март 25, 2016, 00:38
Пытался по всякому
Код:

QTime timeer ;
timeer.start();
timeer.elapsed();

//микро секунды
double mtime()
{
    struct timeval t;
    gettimeofday(&t, NULL);
 
    double mt=(double)t.tv_sec*1000000+t.tv_usec;

}
//наносекунды
double mtime2()
{
    struct timespec t;
    clock_gettime(CLOCK_REALTIME, &t);
    double mt = (double)t.tv_sec * 1000000000 + t.tv_nsec;
    return mt;
}

//допустим функция  производящая вычисления
void function(){.........code............};

//////////////////
QTime timeer;
timeer.start();
double times=mtime();
double times2=mtime2();

function();

times=mtime()-times;
times2=mtime2()-times2;
double  fimes3=timeer.elapsed();
/////////////////
На выходе получаю 0.
Как я понимаю 0 потому что слишком быстро выполняется функция для данных единиц времени.
(Если увеличить обьем данных обрабатываемых функцией то результат  есть.)
В интернете читал что можно использовать для этих целей QTestLib.
Только я не понял как.

Подскажите как все таки измерить  скорость  выполнения функции(желательно с примером)?


P.S
В моем проекте  реализованы  различные итерационные методы решения СЛАУ и скорость выполнения нужна для сравнения.


Название: Re: Как измерить время (скорость) выполнения функции
Отправлено: gil9red от Март 25, 2016, 01:09
Ну зациклите вызов функции.

Код
C++ (Qt)
QTime timer;
timer.start();
 
for (int i = 0; i < 1000000; i++) {
   function();
}
 
qDebug() << "Elapsed:" << timer.elapsed();


Название: Re: Как измерить время (скорость) выполнения функции
Отправлено: shtrix от Март 25, 2016, 01:46
А зачем мне решение одного и того же уравнения несколько раз одной и той же функцией(функция выполнилась ответ получен)?
Функция это метод  решения например Минимальных невязок(т.е там идет обработка расширенной матрицы  для получения решения системы линейных уравнений определенным методом)

например:
в функция1  реализован метод Минимальных невязок
в функция2  реализован метод Гаусса-Зейделя
в функция3  реализован метод Наискорейшего спуска
и.т.д

Мне и надо сравнить  время(скорость) работы этих функций-методов .





Название: Re: Как измерить время (скорость) выполнения функции
Отправлено: Racheengel от Март 25, 2016, 02:37
Чем больше раз меняем, тем точнее ответ.


Название: Re: Как измерить время (скорость) выполнения функции
Отправлено: shtrix от Март 25, 2016, 03:05
Мне не то надо.
В общем в программе пользователь выбирает файл с матрицей (матрица может быть любой размерности)потом  метод решения (запускается соответствующая функция решатель)
Потом другой метод(матрица та же) и.т.д
Витоге формируется отчёт с данными для сравнения где должно быть включено время выполнения каждого метода.
Но при небольшой хорошо обусловленной матрице решение будет найдено очень быстро и я получаю 0 - наносекунд.


Название: Re: Как измерить время (скорость) выполнения функции
Отправлено: __Heaven__ от Март 25, 2016, 09:20
Там миллисекунды выводятся. Что вам не нравится в том, чтобы выводить 0? Можете заменить его при выводе в отчёт на <1


Название: Re: Как измерить время (скорость) выполнения функции
Отправлено: Bepec от Март 25, 2016, 09:25
Вам же уже ответили - если вы хотите точного значения, сколько отрабатывает функция, но время её выполнения меньше 1 мс, то вам надо выполнить эту функцию несколько раз(допустим 100) и полученное время разделить на 100.

В вашем же случае я думаю надо тупо писать <1 мс в отчете :)

наносекунды? ОС имеют погрешности в 1-2 мс в таймерах. Если вы хотите очень точного измерения, вам нужно обратить внимание на платформозависимые решения, для каждой ОС в отдельности. К примеру в Windows 7 добавили таймер высокого разрешения с частотой 1Мгц, но он на разном железе получается с разной частотой по слухам. Ни разу не пользовался.

Ссылка про windows
http://iproc.ru/programming/windows-timers/


Название: Re: Как измерить время (скорость) выполнения функции
Отправлено: Igors от Март 25, 2016, 11:34
А зачем мне решение одного и того же уравнения несколько раз одной и той же функцией(функция выполнилась ответ получен)?
Цитировать
- Как измерить температуру насекомого?
- Напихать в банку 100 таких насекомых и опустить туда градусник.
- А зачем мне 100 насекомых?
- Чтобы измерить температуру
Других способов принципиально нет, поэтому даже не зная что делает TestLib можно утверждать что он будет делать то же самое, возможно только чуть более удобно


Название: Re: Как измерить время (скорость) выполнения функции
Отправлено: qate от Март 25, 2016, 13:33
   QElapsedTimer timer;
   timer.start();
// ...
   qDebug() << timer.nsecsElapsed();


Название: Re: Как измерить время (скорость) выполнения функции
Отправлено: deMax от Март 25, 2016, 16:03
Как то так (http://www.cyberforum.ru/visual-cpp/thread334016.html)

Код:
#include <windows.h>
 
int main()
{
    LARGE_INTEGER freq;
    LARGE_INTEGER t1;
    LARGE_INTEGER t2;
    if(QueryPerformanceFrequency(&freq))
    {
        QueryPerformanceCounter(&t1);
        //...Профилируемый код...
        QueryPerformanceCounter(&t2);
        double dt = t2.QuadPart - t1.QuadPart;
        double elapsed_time = 1000 * dt / freq.QuadPart; // время выполнения в миллисекундах...
    }
    else
    {
        // ОШИБКА!!! Счетчик монитора производительности не поддерживается системой...
    }
    return 0;
}

p.s. А вообще вам же сказали запустите 1000 раз результат поделите на 1000 и не мучайте людям мозг.


Название: Re: Как измерить время (скорость) выполнения функции
Отправлено: Bepec от Март 25, 2016, 18:09
Оффтоп: подсчитать наносекунды, я думаю можно... При подключении периферии стоимостью где то в пару лямов $ :D


Название: Re: Как измерить время (скорость) выполнения функции
Отправлено: shtrix от Март 25, 2016, 19:01
Оффтоп: подсчитать наносекунды, я думаю можно... При подключении периферии стоимостью где то в пару лямов $ :D
Ну насчет наносекунд я вычитал на просторах интернета
например тут http://all-ht.ru/inf/prog/c/func/clock_gettime.html (http://all-ht.ru/inf/prog/c/func/clock_gettime.html)

Код:
#include < stdio.h > //Для printf
#include < time.h >  //Для clock_gettime

int main (void)

   //Структуры для сохранения определенного времени
   struct timespec mt1, mt2;
   //Переменная для расчета дельты времени
   long int tt;     
   
   //Определяем текущее время
   clock_gettime (CLOCK_REALTIME, &mt1);
   
   //Выводим определенное время на экран консоли
   printf (“Секунды: %ld\n”,mt1.tv_sec);
   printf (“Наносекунды: %ld\n”,mt1.tv_nsec);

   //Определяем текущее время
   clock_gettime (CLOCK_REALTIME, &mt2);

   //Рассчитываем разницу времени между двумя измерениями
   tt=1000000000*(mt2.tv_sec - mt1.tv_sec)+(mt2.tv_nsec - mt1.tv_nsec);

   //Выводим результат расчета на экран
   printf (“Затрачено время: %ld нс\n”,tt);

   return 0;
}


(http://i76.fastpic.ru/big/2016/0325/1d/3c1575573ac2483af3b3e7c1c74e771d.png)


Название: Re: Как измерить время (скорость) выполнения функции
Отправлено: shtrix от Март 25, 2016, 19:23
Там миллисекунды выводятся. Что вам не нравится в том, чтобы выводить 0? Можете заменить его при выводе в отчёт на <1
В принципе да  ;D
Чет не подумл ;D


Название: Re: Как измерить время (скорость) выполнения функции
Отправлено: shtrix от Март 25, 2016, 19:36
   QElapsedTimer timer;
   timer.start();
// ...
   qDebug() << timer.nsecsElapsed();
Вроде  то что надо.
Спасибо.


Название: Re: Как измерить время (скорость) выполнения функции
Отправлено: nworm от Март 28, 2016, 19:34
Можешь ещё процессорные тики считать на ассемблере.
Вот пример (http://proginfo.ru/asm/)
В принципе, в этом случае можно без зацикливания.