Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/153: Рейтинг темы: голосов - 153, средняя оценка - 4.52
4 / 4 / 1
Регистрация: 01.03.2010
Сообщений: 83
1

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

04.12.2010, 15:08. Показов 29785. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мне нужно сравнить несколько алгоритмов сортировки.
Но таким способом как у меня, дает очень маленькие значения ....
дл массива 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);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2010, 15:08
Ответы с готовыми решениями:

как узнать время работы программы решения алгоритма
Добрый вечер! Подскажите, пожалуйста, как сделать так, чтобы программа выводила на экран время,...

Как узнать кодировку вывода в консоль во время выполнения программы?
Привет всем! Я новичок, и возникла идея написать консольное приложение для Windows которое...

Как узнать тип шаблонного класса во время выполнения программы?
Тоесть: имеем класс list&lt;int&gt; или list&lt;double&gt;, и как узнать какой это тип? Ну int или double?

Время выполнения алгоритма
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;time.h&gt; using namespace std; void...

17
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
04.12.2010, 15:11 2
Так попробуй
C++
1
2
3
4
5
6
#include<windows.h>
 
double start = GetTickCount();
///// сортирока
double finish = GetTickCount();
finish - start; // время сортировки
0
4 / 4 / 1
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 15:29  [ТС] 3
в принципе тоже самое ...
и почему то когда запускаю несколько раз, выдает знаеение то ноль, то 15, то 16
а для сортировки вставками, постоянно ноль
0
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
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) - количество процессорных тактов.
0
4 / 4 / 1
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 19:50  [ТС] 5
пользуюсь Visual Studio 2008 , для него пойдет ?
1
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
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);
}
0
4 / 4 / 1
Регистрация: 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);
}
ясно, а что ставить в начало алоритма, а что в конец ? ... не совсем понятно
0
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
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;
}
в таком виде должно работать.
0
4 / 4 / 1
Регистрация: 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;
}
в таком виде должно работать.
не, не работает
0
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
04.12.2010, 21:29 10
а код из шестого сообщения работает? (как Вы поняли у меня VS нет, поэтому проверить я не могу)
и "не работает" или "не компилируется"? если не копилируется - что в сообщении об ошибке?
0
242 / 120 / 14
Регистрация: 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;
0
4 / 4 / 1
Регистрация: 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);
}
0
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
04.12.2010, 21:52 13
Хорошо, хотя теперь у меня возникли вопросы. Ладно, доберусь до машины с вс проверю.

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

зы: а вобще RUSya82 насчёт многоразового запуска сортировки прав.
0
4 / 4 / 1
Регистрация: 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;
кажется я не совсем понял этот метод, тут их два, или один, а почему тогда разделили на два кода ?
0
242 / 120 / 14
Регистрация: 15.10.2010
Сообщений: 395
04.12.2010, 22:36 15
Один.
Объявите в начале функции main две переменные типа структуры SYSTEMTIME, в например st1 и st2.
Функция GetLocalTime(&st1) записывает в st1 время на момент вызова.
Далее Вы вызываете требуемую функцию сортировки 5000 раз(это число произвольно).
Далее GetLocalTime(&st2) записывает в st2 время окончания сортировок.

Вторая часть выводит на экран время в миллисекундах. Просто разница во времени делится на 5000, чтобы получить среднее время, на работу одной функции.
З.Ы. подключите windows.h
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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;
}
0
242 / 120 / 14
Регистрация: 15.10.2010
Сообщений: 395
04.12.2010, 22:37 17
Цитата Сообщение от igorio4eg Посмотреть сообщение
а почему тогда разделили на два кода ?
Между первой и второй частью может быть какой то код, как в моей программе, из которой я ето взял.
0
4 / 4 / 1
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 23:15  [ТС] 18
Разобрался, нормально. в принципе выдает тоже самое что
C++
1
2
3
    double start = GetTickCount();
    double finish = GetTickCount();
    cout << "Время: " << finish - start << endl;
0
04.12.2010, 23:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2010, 23:15
Помогаю со студенческими работами здесь

Рассчитать время выполнения алгоритма
рассчитать время выполнения алгоритма со сложностью О (n^2) для n=10000 если время выполнения для...

Как правильно задать параметр "время выполнения алгоритма"?
как правильно задать параметр &quot;время выполнения алгоритма&quot;? #include &lt;iostream&gt; #include &lt;math.h&gt;...

Алгоритм Евклида, показать время выполнения алгоритма
Есть такой код: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #define N1 386...

Время выполнения рекурсивного и итерационного алгоритма быстрой сортировки
Почему вот это : void sort(int *ar, int L, int R){ int i, j, x, buf; x = ar; i =...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru