Форум программистов, компьютерный форум CyberForum.ru

Как узнать время выполнения алгоритма - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.71
igorio4eg
 Аватар для igorio4eg
3 / 3 / 0
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 15:08     Как узнать время выполнения алгоритма #1
Мне нужно сравнить несколько алгоритмов сортировки.
Но таким способом как у меня, дает очень маленькие значения ....
дл массива int - ов, размером в [2000] было 0,016 для массива [20000] что то около 0,745 .... это нормально ? есть еще какие то методы ? .....
вот мой вариант
C++
1
2
3
4
5
6
    clock_t time;
    time = clock();
           // КОД
    time = clock() - time;
    cout << "Time: "; 
    printf("%f", (double)time / CLOCKS_PER_SEC);
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
04.12.2010, 15:11     Как узнать время выполнения алгоритма #2
Так попробуй
C++
1
2
3
4
5
6
#include<windows.h>
 
double start = GetTickCount();
///// сортирока
double finish = GetTickCount();
finish - start; // время сортировки
igorio4eg
 Аватар для igorio4eg
3 / 3 / 0
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 15:29  [ТС]     Как узнать время выполнения алгоритма #3
в принципе тоже самое ...
и почему то когда запускаю несколько раз, выдает знаеение то ноль, то 15, то 16
а для сортировки вставками, постоянно ноль
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
04.12.2010, 17:47     Как узнать время выполнения алгоритма #4
скажите пожалуйста, каким компилятором вы пользуетесь.

Добавлено через 15 минут
вобщем для g++:

код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
using namespace std;
static inline unsigned long long int tick() 
{
unsigned long long int d;
__asm__ __volatile__ ("rdtsc" : "=A" (d) );
return d;
}
 
int main()
{
    unsigned long long int a = 0;
    unsigned long long int b = 0;
    a=tick();
   //сортировка
    b=tick();
    cout<<b-a<<endl;
    return 0;
}


(b-a) - количество процессорных тактов.
igorio4eg
 Аватар для igorio4eg
3 / 3 / 0
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 19:50  [ТС]     Как узнать время выполнения алгоритма #5
пользуюсь Visual Studio 2008 , для него пойдет ?
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
04.12.2010, 21:00     Как узнать время выполнения алгоритма #6
источник утверждает что пойдет для десятой(и вероятно для восьмой) студии следующее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// rdtsc.cpp
// processor: x86, x64
#include <stdio.h>
#include <intrin.h>
 
#pragma intrinsic(__rdtsc)
 
int main()
{
    unsigned __int64 i;
    i = __rdtsc();
    printf_s("%I64d ticks\n", i);
}
igorio4eg
 Аватар для igorio4eg
3 / 3 / 0
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 21:07  [ТС]     Как узнать время выполнения алгоритма #7
Цитата Сообщение от Vladimir. Посмотреть сообщение
источник утверждает что пойдет для десятой студии следующее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// rdtsc.cpp
// processor: x86, x64
#include <stdio.h>
#include <intrin.h>
 
#pragma intrinsic(__rdtsc)
 
int main()
{
    unsigned __int64 i;
    i = __rdtsc();
    printf_s("%I64d ticks\n", i);
}
ясно, а что ставить в начало алоритма, а что в конец ? ... не совсем понятно
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
04.12.2010, 21:13     Как узнать время выполнения алгоритма #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <intrin.h>
#pragma intrinsic(__rdtsc)
 
unsigned __int64 tick(){
    return (__rdtsc());
 
}
 
 
 
int main()
{
    unsigned __int64 a,b;
    a = tick();
    // проверяемый код
    b = tick();
    
    std::cout<<b-a<<std::endl;
}
в таком виде должно работать.
igorio4eg
 Аватар для igorio4eg
3 / 3 / 0
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 21:18  [ТС]     Как узнать время выполнения алгоритма #9
Цитата Сообщение от Vladimir. Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <intrin.h>
#pragma intrinsic(__rdtsc)
 
unsigned __int64 tick(){
    return (__rdtsc());
 
}
 
 
 
int main()
{
    unsigned __int64 a,b;
    a = tick();
    // проверяемый код
    b = tick();
    
    std::cout<<b-a<<std::endl;
}
в таком виде должно работать.
не, не работает
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
04.12.2010, 21:29     Как узнать время выполнения алгоритма #10
а код из шестого сообщения работает? (как Вы поняли у меня VS нет, поэтому проверить я не могу)
и "не работает" или "не компилируется"? если не копилируется - что в сообщении об ошибке?
RUSya82
 Аватар для RUSya82
236 / 114 / 3
Регистрация: 15.10.2010
Сообщений: 395
04.12.2010, 21:46     Как узнать время выполнения алгоритма #11
Попробуйте структуру SYSTEMTIME.
Сортировки

Цитата Сообщение от igorio4eg Посмотреть сообщение
и почему то когда запускаю несколько раз, выдает знаеение то ноль, то 15, то 16
Эта проблема решается запуском функции сортировки много много раз, с определением среднего времени.
C++
1
2
3
4
GetLocalTime(&st1);
for(int i =0;i<5000;i++)
Function();
GetLocalTime(&st2);
просто потом:
C++
1
2
3
4
5
     double T1 = (double)(st1.wMinute*60*1000 + st1.wSecond*1000 + st1.wMilliseconds); //вычисляем время
     double T2 = (double)(st2.wMinute*60*1000 + st2.wSecond*1000 + st2.wMilliseconds);
     cout << endl << RUS("Для size = ") << size2[j] << "   \n" ;
     cout << RUS("время выполнения функции: ");
     cout << (T2 - T1)/5000 << RUS("   Миллисекунд") << endl;
igorio4eg
 Аватар для igorio4eg
3 / 3 / 0
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 21:46  [ТС]     Как узнать время выполнения алгоритма #12
код из 6 сообщения работает, я разобрался ,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <intrin.h>
 
#pragma intrinsic(__rdtsc)
 
int main()
{
    unsigned __int64 i, m, res;
    i = __rdtsc();
    // код
    m = __rdtsc();
    res = m - i;
    printf_s("%I64d ticks\n", res);
}
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
04.12.2010, 21:52     Как узнать время выполнения алгоритма #13
Хорошо, хотя теперь у меня возникли вопросы. Ладно, доберусь до машины с вс проверю.

Учитывайте, что есть тонкости с dts вроде общей загруженности проца другими программами и верной работы на некоторых многоядерных машинах.

зы: а вобще RUSya82 насчёт многоразового запуска сортировки прав.
igorio4eg
 Аватар для igorio4eg
3 / 3 / 0
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 22:22  [ТС]     Как узнать время выполнения алгоритма #14
Цитата Сообщение от RUSya82 Посмотреть сообщение
Попробуйте структуру SYSTEMTIME.
Сортировки


Эта проблема решается запуском функции сортировки много много раз, с определением среднего времени.
C++
1
2
3
4
GetLocalTime(&st1);
for(int i =0;i<5000;i++)
Function();
GetLocalTime(&st2);
просто потом:
C++
1
2
3
4
5
     double T1 = (double)(st1.wMinute*60*1000 + st1.wSecond*1000 + st1.wMilliseconds); //вычисляем время
     double T2 = (double)(st2.wMinute*60*1000 + st2.wSecond*1000 + st2.wMilliseconds);
     cout << endl << RUS("Для size = ") << size2[j] << "   \n" ;
     cout << RUS("время выполнения функции: ");
     cout << (T2 - T1)/5000 << RUS("   Миллисекунд") << endl;
кажется я не совсем понял этот метод, тут их два, или один, а почему тогда разделили на два кода ?
RUSya82
 Аватар для RUSya82
236 / 114 / 3
Регистрация: 15.10.2010
Сообщений: 395
04.12.2010, 22:36     Как узнать время выполнения алгоритма #15
Один.
Объявите в начале функции main две переменные типа структуры SYSTEMTIME, в например st1 и st2.
Функция GetLocalTime(&st1) записывает в st1 время на момент вызова.
Далее Вы вызываете требуемую функцию сортировки 5000 раз(это число произвольно).
Далее GetLocalTime(&st2) записывает в st2 время окончания сортировок.

Вторая часть выводит на экран время в миллисекундах. Просто разница во времени делится на 5000, чтобы получить среднее время, на работу одной функции.
З.Ы. подключите windows.h
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.12.2010, 22:36     Как узнать время выполнения алгоритма #16
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <time.h>
 
/*
int main()
{
        unsigned int x = 0xFFFFFFFF;
 
        // some code for calculate time
        while(--x != 0);
 
        printf("%g\n", (double)clock() / CLOCKS_PER_SEC);
        return 0;
}
*/
 
int main()
{
        unsigned int x = 0xFFFFFFFF;
        time_t beg, end;
 
        time(&beg);
 
        // some code for calculate time
        while(--x != 0);
 
        time(&end);
 
        printf("%g\n", difftime(end, beg));
        return 0;
}
RUSya82
 Аватар для RUSya82
236 / 114 / 3
Регистрация: 15.10.2010
Сообщений: 395
04.12.2010, 22:37     Как узнать время выполнения алгоритма #17
Цитата Сообщение от igorio4eg Посмотреть сообщение
а почему тогда разделили на два кода ?
Между первой и второй частью может быть какой то код, как в моей программе, из которой я ето взял.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2010, 23:15     Как узнать время выполнения алгоритма
Еще ссылки по теме:

Как узнать тип шаблонного класса во время выполнения программы? C++
Как правильно задать параметр "время выполнения алгоритма"? C++
C++ Как узнать сложность алгоритма(ресурсы ,способы)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
igorio4eg
 Аватар для igorio4eg
3 / 3 / 0
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 23:15  [ТС]     Как узнать время выполнения алгоритма #18
Разобрался, нормально. в принципе выдает тоже самое что
C++
1
2
3
    double start = GetTickCount();
    double finish = GetTickCount();
    cout << "Время: " << finish - start << endl;
Yandex
Объявления
04.12.2010, 23:15     Как узнать время выполнения алгоритма
Ответ Создать тему
Опции темы

Текущее время: 08:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru