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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как измерить время (скорость) выполнения функции  (Прочитано 10742 раз)
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
В моем проекте  реализованы  различные итерационные методы решения СЛАУ и скорость выполнения нужна для сравнения.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Март 25, 2016, 01:09 »

Ну зациклите вызов функции.

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

shtrix
Гость
« Ответ #2 : Март 25, 2016, 01:46 »

А зачем мне решение одного и того же уравнения несколько раз одной и той же функцией(функция выполнилась ответ получен)?
Функция это метод  решения например Минимальных невязок(т.е там идет обработка расширенной матрицы  для получения решения системы линейных уравнений определенным методом)

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

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



« Последнее редактирование: Март 25, 2016, 01:49 от shtrix » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Март 25, 2016, 02:37 »

Чем больше раз меняем, тем точнее ответ.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
shtrix
Гость
« Ответ #4 : Март 25, 2016, 03:05 »

Мне не то надо.
В общем в программе пользователь выбирает файл с матрицей (матрица может быть любой размерности)потом  метод решения (запускается соответствующая функция решатель)
Потом другой метод(матрица та же) и.т.д
Витоге формируется отчёт с данными для сравнения где должно быть включено время выполнения каждого метода.
Но при небольшой хорошо обусловленной матрице решение будет найдено очень быстро и я получаю 0 - наносекунд.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Март 25, 2016, 09:20 »

Там миллисекунды выводятся. Что вам не нравится в том, чтобы выводить 0? Можете заменить его при выводе в отчёт на <1
Записан
Bepec
Гость
« Ответ #6 : Март 25, 2016, 09:25 »

Вам же уже ответили - если вы хотите точного значения, сколько отрабатывает функция, но время её выполнения меньше 1 мс, то вам надо выполнить эту функцию несколько раз(допустим 100) и полученное время разделить на 100.

В вашем же случае я думаю надо тупо писать <1 мс в отчете Улыбающийся

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

Ссылка про windows
http://iproc.ru/programming/windows-timers/
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Март 25, 2016, 11:34 »

А зачем мне решение одного и того же уравнения несколько раз одной и той же функцией(функция выполнилась ответ получен)?
Цитировать
- Как измерить температуру насекомого?
- Напихать в банку 100 таких насекомых и опустить туда градусник.
- А зачем мне 100 насекомых?
- Чтобы измерить температуру
Других способов принципиально нет, поэтому даже не зная что делает TestLib можно утверждать что он будет делать то же самое, возможно только чуть более удобно
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #8 : Март 25, 2016, 13:33 »

   QElapsedTimer timer;
   timer.start();
// ...
   qDebug() << timer.nsecsElapsed();
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #9 : Март 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 и не мучайте людям мозг.
Записан
Bepec
Гость
« Ответ #10 : Март 25, 2016, 18:09 »

Оффтоп: подсчитать наносекунды, я думаю можно... При подключении периферии стоимостью где то в пару лямов $ Веселый
Записан
shtrix
Гость
« Ответ #11 : Март 25, 2016, 19:01 »

Оффтоп: подсчитать наносекунды, я думаю можно... При подключении периферии стоимостью где то в пару лямов $ Веселый
Ну насчет наносекунд я вычитал на просторах интернета
например тут 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;
}


Записан
shtrix
Гость
« Ответ #12 : Март 25, 2016, 19:23 »

Там миллисекунды выводятся. Что вам не нравится в том, чтобы выводить 0? Можете заменить его при выводе в отчёт на <1
В принципе да  Смеющийся
Чет не подумл Смеющийся
Записан
shtrix
Гость
« Ответ #13 : Март 25, 2016, 19:36 »

   QElapsedTimer timer;
   timer.start();
// ...
   qDebug() << timer.nsecsElapsed();
Вроде  то что надо.
Спасибо.
Записан
nworm
Гость
« Ответ #14 : Март 28, 2016, 19:34 »

Можешь ещё процессорные тики считать на ассемблере.
Вот пример
В принципе, в этом случае можно без зацикливания.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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