Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
JustUnProgger
0 / 0 / 0
Регистрация: 24.06.2018
Сообщений: 7
1

Измерить время выполнения сортировки

24.06.2018, 21:50. Просмотров 975. Ответов 12
Метки нет (Все метки)

Всем привет) Хелпаните с задачей: Измерить время выполнения сортировки(в наносек-х),
пытался с помощью <time.h> time_t и clock_t,выводит постоянно 0 сек. также пробывал сделать (1000 раз) цикл из сортировки и разделить на их кол-во, тоже что-то не то выдаёт,

читал про RDTSC,но как правильно на си выполнить не понял. Посоветуйте что-нибудь,вроде прога не сложная,но я на этом застрял.
вот мои попытки:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define N 1000
#define P 1000
void SelectionSort (int k,int x[]) 
{
      int i,j,min,temp,p;
      clock_t fTimeStart,fTimeStop;
      (double)fTimeStart;
      (double)fTimeStop;
      (double)CLOCKS_PER_SEC;
      fTimeStart = clock()/CLOCKS_PER_SEC; 
      for (p=0;p<P;p++)
      {
         for (i=0;i<(k-1);i++)
        {
            min=i; 
            for (j=i+1;j<k;j++)
            {
              if (x[j]<x[min])
              {
                min=j;
              }
            }
              temp=x[i];
              x[i]=x[min];
              x[min]=temp;
        }
        }
     fTimeStop = clock()/CLOCKS_PER_SEC;
printf("\nReal time for sorting %.0f(ns)\n", (((double)fTimeStop-fTimeStart)/P)*1000000000);
}
int main() 
{
    int mass1[N];
    int i;
    srand(0);
    for(i=0;i<N;i++)
    {
        mass1[i]=rand()%1000;
    }
    SelectionSort(N,mass1); 
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2018, 21:50
Ответы с готовыми решениями:

Измерить время выполнения программы
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;time.h&gt; main () { FILE *in; FILE *out; ...

Подсчитать время выполнения сортировки
Нужно посчитать за какой время выполнится стандартная сортировка и сортировка, написанная мной....

Как измерить время выполнения программы с использованием RDTSC
Мне нужно используя RDTSC (как я понял, это ассемблерной вставкой делать нужно) посчитать время...

Моделирование маятника: измерить время движения маятника с начала его движения до полной остановки
Подскажите пожалуйста какую формулу в данном коде добавить чтоб измерялось время движения маятника...

Время выполнения Функции
Всем привет, можно ли замерить скорость в цикле из 50-10 проходов? Пробывал gettimeofday, но он...

12
Ovederax
215 / 148 / 101
Регистрация: 30.04.2017
Сообщений: 315
25.06.2018, 08:40 2
JustUnProgger,
clock() в наносекундах тебе не позволит посчитать время. CLOCK_PER_SEC - обычно 1000 для ПК - т.е. это мс.
Предварительно домнажай на тысячу, потом дели на константу - получишь время в мс.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void SelectionSort (int k,int x[])
{
    int i,j,min,temp,p;
    clock_t fTimeStart,fTimeStop;
    fTimeStart = clock()*1000/CLOCKS_PER_SEC;
    for (p=0;p<P;p++)           //кол-во повторов
    {
        for (i=0;i<(k-1);i++)   //сортировка
        {
            min=i;
            for (j=i+1;j<k;j++)
                if (x[j]<x[min])
                    min=j;
            temp=x[i];
            x[i]=x[min];
            x[min]=temp;
        }
    }
    fTimeStop = clock()*1000/CLOCKS_PER_SEC;
    printf("\nReal time for sorting %i(ms)\n",fTimeStop-fTimeStart);
}
0
JustUnProgger
0 / 0 / 0
Регистрация: 24.06.2018
Сообщений: 7
25.06.2018, 09:24  [ТС] 3
Ovederax, выводит постоянно 1ms. думаю это не совсем правильно

Добавлено через 5 минут
Ovederax, (1)а если я заранее на миллиард домножу?не получатся наносек-ды?

(2)или к примеру я домножу заранее на 1000 и сделаю сортировку 1000 раз и результат так как это инт не буду делить и он получится как бы 10-6 т.е микросек-ды
0
Ovederax
215 / 148 / 101
Регистрация: 30.04.2017
Сообщений: 315
25.06.2018, 09:26 4
Лучший ответ Сообщение было отмечено JustUnProgger как решение

Решение

JustUnProgger, хмм, у меня выводит "Real time for sorting 2017(ms)".

Не по теме:

Вы пользуетесь квантовым компьютером? Может поэтому так быстро...


Этот код выводит 1 мс?
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
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define N 1000
#define P 1000
 
void SelectionSort (int k,int x[])
{
    int i,j,min,temp,p;
    clock_t fTimeStart,fTimeStop;
    fTimeStart = clock()*1000/CLOCKS_PER_SEC;
    for (p=0;p<P;p++)           //кол-во повторов
    {
        for (i=0;i<(k-1);i++)   //сортировка
        {
            min=i;
            for (j=i+1;j<k;j++)
                if (x[j]<x[min])
                    min=j;
            temp=x[i];
            x[i]=x[min];
            x[min]=temp;
        }
    }
    fTimeStop = clock()*1000/CLOCKS_PER_SEC;
    printf("\nReal time for sorting %i(ms)\n",fTimeStop-fTimeStart);
}
 
int main()
{
    int mass1[N];
    int i;
    srand(0);
    for(i=0;i<N;i++)
    {
        mass1[i]=rand()%1000;
    }
    SelectionSort(N,mass1);
}
1
JustUnProgger
0 / 0 / 0
Регистрация: 24.06.2018
Сообщений: 7
25.06.2018, 09:29  [ТС] 5
Ovederax, серьёзно?
как такое может быть ?мс это же милисекунды т.е 10-3

получается ваша программа из нескольких итерраций работает аж 2 сек-ды?

может скинете полную прогу?)
0
JustUnProgger
0 / 0 / 0
Регистрация: 24.06.2018
Сообщений: 7
25.06.2018, 09:35  [ТС] 6
Ovederax, вот,при том что сортировка стоит в цикле из 1000 итерраций
0
Миниатюры
Измерить время выполнения сортировки  
Ovederax
215 / 148 / 101
Регистрация: 30.04.2017
Сообщений: 315
25.06.2018, 09:41 7
Цитата Сообщение от JustUnProgger Посмотреть сообщение
получается ваша программа из нескольких итерраций работает аж 2 сек-ды?
нет на 1000 итераций - работает 2000 мс -> 1 итерация в среднем 2мс
Цитата Сообщение от JustUnProgger Посмотреть сообщение
Ovederax, (1)а если я заранее на миллиард домножу?не получатся наносек-ды?
Да получится, но точности то не будет, на конце будут просто нули висеть. Если нужно такой вывод то домнажайте и проверяте, чтобы результаты помещались в переменную типа long
Цитата Сообщение от JustUnProgger Посмотреть сообщение
вот,при том что сортировка стоит в цикле из 1000 итерраций
Ну ё-маё, мой компьютер медленнннный

Добавлено через 2 минуты
А, нее, все норм у меня 600мс - я собирал debug версию...
0
JustUnProgger
0 / 0 / 0
Регистрация: 24.06.2018
Сообщений: 7
25.06.2018, 09:52  [ТС] 8
Ovederax, т.е. ваш вариант где заранее домножить на 1000.
и в цикле из 1000 итерраций следовательно результат получится в 10-6 т.е. это мкс=микросекунды а не мс,(1)верно же?
(2)и он какбы примерно точный до миллионных?

Добавлено через 38 секунд
Ovederax, в любом случае спасибо большое, хотя бы встал с мёртвой точки
0
Ovederax
215 / 148 / 101
Регистрация: 30.04.2017
Сообщений: 315
25.06.2018, 10:08 9
Цитата Сообщение от JustUnProgger Посмотреть сообщение
т.е. ваш вариант где заранее домножить на 1000.
да, можно домножить на 10^9 - будут наносекунды.
Цитата Сообщение от JustUnProgger Посмотреть сообщение
и в цикле из 1000 итерраций следовательно результат получится в 10-6 т.е. это мкс=микросекунды а не мс,(1)верно же?
Если поделите на тысячу иттераций - все равно ответ в мс будет.
Цитата Сообщение от JustUnProgger Посмотреть сообщение
(2)и он какбы примерно точный до миллионных?
Точность clock() - 1 мс. Если нужны нс - ищите другой способ измерения временных промежутков.
0
JustUnProgger
0 / 0 / 0
Регистрация: 24.06.2018
Сообщений: 7
25.06.2018, 10:14  [ТС] 10
Цитата Сообщение от Ovederax Посмотреть сообщение
Если поделите на тысячу иттераций - все равно ответ в мс будет.
вы имели в виду если не поделите? потому что если поделю как раз таки и будет время прохождения сортировки

Добавлено через 1 минуту
Цитата Сообщение от Ovederax Посмотреть сообщение
Если поделите на тысячу иттераций - все равно ответ в мс будет.
а если я не делю время одного прохождения сортировки как раз таки умножается на 1000
0
Ovederax
215 / 148 / 101
Регистрация: 30.04.2017
Сообщений: 315
25.06.2018, 11:09 11
JustUnProgger, Вопросы это сложно. я не понимать...
0
JustUnProgger
0 / 0 / 0
Регистрация: 24.06.2018
Сообщений: 7
25.06.2018, 23:32  [ТС] 12
Ovederax, можно задать последний вопрос?

Цитата Сообщение от Ovederax Посмотреть сообщение
CLOCK_PER_SEC - обычно 1000 для ПК - т.е. это мс.
Предварительно домнажай на тысячу, потом дели на константу - получишь время в мс.
если не домножать и не делить на константу приращение времени выведится в мс?

т.е

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
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define N 1000
#define P 1000
 
void SelectionSort (int k,int x[])
{
    int i,j,min,temp,p;
    clock_t fTimeStart,fTimeStop;
    fTimeStart = clock();
    for (p=0;p<P;p++)           //кол-во повторов
    {
        for (i=0;i<(k-1);i++)   //сортировка
        {
            min=i;
            for (j=i+1;j<k;j++)
                if (x[j]<x[min])
                    min=j;
            temp=x[i];
            x[i]=x[min];
            x[min]=temp;
        }
    }
    fTimeStop = clock();
    printf("\nReal time for sorting %i(ms)\n",fTimeStop-fTimeStart);
}
 
int main()
{
    int mass1[N];
    int i;
    srand(0);
    for(i=0;i<N;i++)
    {
        mass1[i]=rand()%1000;
    }
    SelectionSort(N,mass1);
}
0
Ovederax
215 / 148 / 101
Регистрация: 30.04.2017
Сообщений: 315
26.06.2018, 08:55 13
Цитата Сообщение от JustUnProgger Посмотреть сообщение
если не домножать и не делить на константу приращение времени выведится в мс?
Приращение времени будет выводится в тиках процессора. Константа нужна для того, чтобы переводить время из тиков в секунды. Эта константа различна для разных ОС. На Linux она может быть равна 1 000 000. Можно считать время в тиках, но переводить их во время(сек,мс) при выводе на экран.
C
1
2
3
...
long dtime = (fTimeStop-fTimeStart)*1000/CLOCK_PER_SEC;
printf("\nReal time for sorting %i(ms)\n",dtime);
Добавлено через 4 минуты
<time.h>
The value of CLOCKS_PER_SEC shall be 1 million on XSI-conformant systems.
0
26.06.2018, 08:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2018, 08:55

Задать время выполнения программы
Нужно, чтобы некоторый код выполнялся в течение 5 минут, а после выводились результаты его...

Как ограничить время выполнения программы?
Добрый день! Задали написать программу, следующего содержания: &quot;Для натурального числа сумма...

Как засечь время выполнения функции?
Упражнение 3.1 K&amp;R как новичку без серьезных описаний и дополнений кода засечь время выполнения...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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