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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.71
igorio4eg
4 / 4 / 0
Регистрация: 01.03.2010
Сообщений: 83
#1

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

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

Мне нужно сравнить несколько алгоритмов сортировки.
Но таким способом как у меня, дает очень маленькие значения ....
дл массива 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2010, 15:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как узнать время выполнения алгоритма (C++):

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

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

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

Время выполнения алгоритма - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;time.h&gt; using namespace std; void heapSort(int *a, int size) ; //...

Рассчитать время выполнения алгоритма - C++
рассчитать время выполнения алгоритма со сложностью О (n^2) для n=10000 если время выполнения для n=1000 равно 0,1 мсек помогите...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
asics
Freelance
Эксперт С++
2847 / 1784 / 144
Регистрация: 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
igorio4eg
4 / 4 / 0
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 15:29  [ТС] #3
в принципе тоже самое ...
и почему то когда запускаю несколько раз, выдает знаеение то ноль, то 15, то 16
а для сортировки вставками, постоянно ноль
0
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) - количество процессорных тактов.
0
igorio4eg
4 / 4 / 0
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 19:50  [ТС] #5
пользуюсь Visual Studio 2008 , для него пойдет ?
1
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);
}
0
igorio4eg
4 / 4 / 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);
}
ясно, а что ставить в начало алоритма, а что в конец ? ... не совсем понятно
0
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;
}
в таком виде должно работать.
0
igorio4eg
4 / 4 / 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;
}
в таком виде должно работать.
не, не работает
0
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
04.12.2010, 21:29 #10
а код из шестого сообщения работает? (как Вы поняли у меня VS нет, поэтому проверить я не могу)
и "не работает" или "не компилируется"? если не копилируется - что в сообщении об ошибке?
0
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;
0
igorio4eg
4 / 4 / 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);
}
0
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
04.12.2010, 21:52 #13
Хорошо, хотя теперь у меня возникли вопросы. Ладно, доберусь до машины с вс проверю.

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

зы: а вобще RUSya82 насчёт многоразового запуска сортировки прав.
0
igorio4eg
4 / 4 / 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;
кажется я не совсем понял этот метод, тут их два, или один, а почему тогда разделили на два кода ?
0
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
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2010, 22:36
Привет! Вот еще темы с ответами:

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

После выполнения алгоритма программа сразу закрывается - как исправить? - C++
дела такое: (циклический алгоритм, задача с матрицами) программа запускается в Win32 Console Application, но после выполнения алгоритма...

Как узнать сложность алгоритма(ресурсы ,способы) - C++
Здравствуйте, нужно узнать сложность какой-нибудь ф-ии из стандартной библиотеки cpp. Где это можно узнать? Например max_element(it it)...

Как узнать скорость выполнения программы? - C++
Должна же быть какая то функция или метод, чтобы узнать время выполнения программы, или возможно есть инструменты в MVS2010 для анализа...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.12.2010, 22:36
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru