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

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

04.12.2010, 15:08. Показов 30917. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.12.2010, 15:08
Ответы с готовыми решениями:

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

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

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

17
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
04.12.2010, 15:11
Так попробуй
C++
1
2
3
4
5
6
#include<windows.h>
 
double start = GetTickCount();
///// сортирока
double finish = GetTickCount();
finish - start; // время сортировки
0
 Аватар для igorio4eg
4 / 4 / 1
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 15:29  [ТС]
в принципе тоже самое ...
и почему то когда запускаю несколько раз, выдает знаеение то ноль, то 15, то 16
а для сортировки вставками, постоянно ноль
0
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
04.12.2010, 17:47
скажите пожалуйста, каким компилятором вы пользуетесь.

Добавлено через 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 / 1
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 19:50  [ТС]
пользуюсь Visual Studio 2008 , для него пойдет ?
1
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
04.12.2010, 21:00
источник утверждает что пойдет для десятой(и вероятно для восьмой) студии следующее:
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 / 1
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 21:07  [ТС]
Цитата Сообщение от 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
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 / 1
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 21:18  [ТС]
Цитата Сообщение от 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
а код из шестого сообщения работает? (как Вы поняли у меня VS нет, поэтому проверить я не могу)
и "не работает" или "не компилируется"? если не копилируется - что в сообщении об ошибке?
0
 Аватар для RUSya82
242 / 120 / 14
Регистрация: 15.10.2010
Сообщений: 395
04.12.2010, 21:46
Попробуйте структуру 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 / 1
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 21:46  [ТС]
код из 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
Хорошо, хотя теперь у меня возникли вопросы. Ладно, доберусь до машины с вс проверю.

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

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

Вторая часть выводит на экран время в миллисекундах. Просто разница во времени делится на 5000, чтобы получить среднее время, на работу одной функции.
З.Ы. подключите windows.h
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
04.12.2010, 22:36
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
 Аватар для RUSya82
242 / 120 / 14
Регистрация: 15.10.2010
Сообщений: 395
04.12.2010, 22:37
Цитата Сообщение от igorio4eg Посмотреть сообщение
а почему тогда разделили на два кода ?
Между первой и второй частью может быть какой то код, как в моей программе, из которой я ето взял.
0
 Аватар для igorio4eg
4 / 4 / 1
Регистрация: 01.03.2010
Сообщений: 83
04.12.2010, 23:15  [ТС]
Разобрался, нормально. в принципе выдает тоже самое что
C++
1
2
3
    double start = GetTickCount();
    double finish = GetTickCount();
    cout << "Время: " << finish - start << endl;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.12.2010, 23:15
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru