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

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

Войти
Регистрация
Восстановить пароль
 
bob2015
1 / 1 / 1
Регистрация: 18.09.2015
Сообщений: 26
#1

Скорость работы функции - C++

18.09.2015, 09:11. Просмотров 369. Ответов 11
Метки нет (Все метки)

Требуется измерить скорость работы функции "func". При этом измерение должно производиться в течении только TIME_TEST секунд. Для такого измерения написал две функции timer_1 и timer_2. В ходе написания возникли следующие вопросы:
1) Почему если в функции timer_1 убрать две строки после которых стоит комментарий "delete", то скорость работы
всегда получается разной, то есть функция timer_1 в этом случае работает неверно? Почему такой ошибки
в функции timer_2 не наблюдается, несмотря на отсутствие похожих строк?
2) Какую из функций timer_1 или timer_2 лучше использовать для решения поставленной задачи и почему?
3) Как бы Вы написали функцию измерения скорости работы функции в течении заданного времени?

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <time.h>
#include <stdio.h>
 
#define TIME_TEST  1.0  // Время тестирования функции в секундах
#define SIZE_BUF  1024  // Размер буфера для тестирования
 
typedef unsigned char BYTE;
typedef unsigned long ULONG;
 
// Функция что-то делающая с входными данными.
void func(BYTE *data)
{
    BYTE tmp;
 
    for(ULONG x = 0; x < SIZE_BUF; x++)
    {
        tmp = data[x];
        data[x] = data[SIZE_BUF - x - 1];
        data[SIZE_BUF - x - 1] = tmp;
    }
}
 
// Первая версия измерения скорости работы функции.
void timer_1()
{
    register ULONG count = 0;
    register time_t timer;
    BYTE data[SIZE_BUF];
    
    // Если две следующие строки убрать, то скорость считается неверно!
    timer = time(0);  // delete
    while(time(0) == timer); //delete
 
    timer = time(0) + TIME_TEST;
 
    while(time(0) < timer)
    {
        func(data);
        count++;
    }
 
    printf("speed = %.0lf kb/sec\n", count / TIME_TEST);
}
 
// Вторая версия измерения скорости работы функции.
void timer_2()
{
    register ULONG count = 0;
    register clock_t timer;
    BYTE data[SIZE_BUF];
    
    timer = clock() + CLOCKS_PER_SEC * TIME_TEST;
 
    while(clock() < timer)
    {
        func(data);
        count++;
    }
 
    printf("speed = %.0lf kb/sec\n", count / TIME_TEST);
}
 
int main()
{
 
    timer_1();
    timer_2();
    
    return 0;
}
Добавлено через 20 минут
Примечание: функция должна корректно работать на всех программно-аппаратных платформах (Windows, Linux/Unix, MAC OS, Haswel, ARM, SPARC, etc).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2015, 09:11     Скорость работы функции
Посмотрите здесь:

Скорость работы функции pow - C++
В программе цикл, который вызывается примерно 50 000 в секунду. В каждой итерации ещё цикл от 1 до 100 повторов. В каждой итерации...

Скорость работы программы - C++
Здравствуйте, не подскажите примерами, как можно посчитать скорость работы части программы, например: Sum= a-b; Узнать за сколько...

Улучшить скорость работы хэш-таблицы - C++
Всем привет! Есть корректно рабочий код работы с хэш-таблицей двумя хэш-функциями: деления и умножения (избегаю коллизий методом цепочки)....

Как измерить скорость работы кода - C++
Хочу оптимизировать свой код и найти самые медленные места Можно как то измерить к примеру сколько времени занимает выполнение отдельного...

Надо увеличить скорость работы программы - C++
std::string separators(&quot;.:,;()-?!'+-/|&quot;); std::map&lt;std::string, int&gt; repeatedWords; size_t index; std::fstream fin(fileName); ...

Потестируйте скорость работы класса больших чисел - C++
Ребятки, сделал себе небольшой классик для больших чисел. Типа того: static const long long BASE = 1000000000; static const int...

Скорость работы std::vector и обычного динамического массива - C++
Всем привет! Есть задача по мат.моделированию, размер сетки 100х50. Использовались обычные динамические массивы: double ***n; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
5274 / 4594 / 1539
Регистрация: 14.04.2014
Сообщений: 18,243
18.09.2015, 09:28     Скорость работы функции #2
У time() слишком низкое разрешение для такого короткого TIME_TEST. Для таких измерений нужно использовать clock() как во второй функции.
К тому же, если говорить о переносимости, не гарантируется, что time() возвращает именно секунды. Разницу нужно определять с помощью difftime().
bob2015
1 / 1 / 1
Регистрация: 18.09.2015
Сообщений: 26
18.09.2015, 20:42  [ТС]     Скорость работы функции #3
Что значит "слишком низкое разрешение"? Можно поподробнее?

Добавлено через 51 секунду
И почему вставка пустого цикла (после которого комментарий "delete") решает эту проблему?
pav1uxa
1788 / 1628 / 622
Регистрация: 23.01.2014
Сообщений: 5,906
Завершенные тесты: 1
18.09.2015, 21:13     Скорость работы функции #4
Цитата Сообщение от bob2015 Посмотреть сообщение
Что значит "слишком низкое разрешение"? Можно поподробнее?
Грубо говоря, значение time(0) меняется раз в секунду, значение clock(), как я понимаю, раз в процессорный такт.

Цитата Сообщение от bob2015 Посмотреть сообщение
Почему если в функции timer_1 убрать две строки после которых стоит комментарий "delete", то скорость работы
всегда получается разной, то есть функция timer_1 в этом случае работает неверно?
Не совсем так.

Так как там разрешение секунда (о чем я написал выше), а тест у вас длится ВСЕГО одну секунду, то такой тест на самом же деле продлится от 0 до 1 секунды. Естественно, как правило меньше 1 и больше 0. Например если тест начался в 12 часов 12 минут и 5.7 секунд, то он продлится всего 0.3 секунду, именно через столько времени значение time(0) изменится.

В тех двух строчках (//delete) Вы добиваетесь того, что функция продолжит работу почти что в тот момент, когда секунда перепрыгнула. То есть длительность работы функции будет стремиться к единице.
nmcf
5274 / 4594 / 1539
Регистрация: 14.04.2014
Сообщений: 18,243
18.09.2015, 21:21     Скорость работы функции #5
Значит, что этот таймер выдаёт секунды (хотя и не гарантировано) и интервал твой секунда. Ты можешь начать измерения в начале какой-то секунды, в середине или в самом конце, когда уже следующая начинается. Соответственно, твоя функция будет вызвана большее число раз или меньшее, а может вообще ни разу. Если в интервале от 34-й строки до начала условия в 36-й секунда сменится, то функция вообще ни разу не будет вызвана, потому что ты разницу задаёшь слишком маленькую. Время измерения у тебя равно шагу таймера, и те 2 строчки пытаются синхронизировать начала измерения с таймером, с началом очередной секунды.
hoggy
6431 / 2649 / 460
Регистрация: 15.11.2014
Сообщений: 5,838
Завершенные тесты: 1
18.09.2015, 22:55     Скорость работы функции #6
Цитата Сообщение от bob2015 Посмотреть сообщение
3) Как бы Вы написали функцию измерения скорости работы функции в течении заданного времени?
никак. затея изначально фейловая.
ваш код кстати, так же не умеет этого делать.
bob2015
1 / 1 / 1
Регистрация: 18.09.2015
Сообщений: 26
19.09.2015, 01:09  [ТС]     Скорость работы функции #7
Почему же не умеет? В чем ошибка? На моем ПК он делает то, что мне надо.
Andrew Sinjagin
19 / 20 / 3
Регистрация: 04.08.2015
Сообщений: 127
19.09.2015, 01:30     Скорость работы функции #8
маленький совет - померьте время до вызовов функции и после, посчитайте интервал, число вызовов вы знаете, скорость работы найти легко, но вообще согласен с hoggy, затея бредовая, проще посмотреть код в ассемблере и ручками посчитать сколько требуется на выполнение функции
bob2015
1 / 1 / 1
Регистрация: 18.09.2015
Сообщений: 26
19.09.2015, 01:43  [ТС]     Скорость работы функции #9
Цитата Сообщение от Andrew Sinjagin Посмотреть сообщение
маленький совет - померьте время до вызовов функции и после, посчитайте интервал, число вызовов вы знаете, скорость работы найти легко, но вообще согласен с hoggy, затея бредовая, проще посмотреть код в ассемблере и ручками посчитать сколько требуется на выполнение функции
Ну вы объясните почему бредовая) И почему это бредовая затея у меня работает? Руками считать можно, если одна функция, а если их тысяча?

Добавлено через 1 минуту
Причем эти функции (тысячу) нужно протестировать по секунде на каждую, а не по 1000.
Andrew Sinjagin
19 / 20 / 3
Регистрация: 04.08.2015
Сообщений: 127
19.09.2015, 04:56     Скорость работы функции #10
Цитата Сообщение от bob2015 Посмотреть сообщение
Ну вы объясните почему бредовая)
есть понятие временная сложность, которая зависит от алгоритма(или алгоритмов) в функции
Затея бредовая, потому что при создании в Release-версии программы компилятор пройдется по коду оптимизатором и скорость работы изменится

Цитата Сообщение от bob2015 Посмотреть сообщение
Руками считать можно, если одна функция, а если их тысяча?
А зачем измерять скорости 1000 функций?

Цитата Сообщение от bob2015 Посмотреть сообщение
Причем эти функции (тысячу) нужно протестировать по секунде на каждую, а не по 1000.
Как сказал pav1uxa, используйте clock(), иначе вы получите полнейшую ерунду, которая будет зависеть от фазы луны и пятен на солнце
nmcf
5274 / 4594 / 1539
Регистрация: 14.04.2014
Сообщений: 18,243
19.09.2015, 08:22     Скорость работы функции #11
Цитата Сообщение от Andrew Sinjagin Посмотреть сообщение
посмотреть код в ассемблере и ручками посчитать сколько требуется на выполнение функции
Это тоже бредовая идея, если говорить о процессорах в ПК. Для многих команд нет точных данных о времени выполнения, оно может зависеть от конкретных операндов, плюс всякие оптимизации.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2015, 11:28     Скорость работы функции
Еще ссылки по теме:

Реализовать сортировку несколькими методами (перестановкой, выбором, вставкой) и оценить скорость их работы. - C++
Дан массив. Реализовать сортировку несколькими методами (перестановкой, выбором, вставкой) и оценить скорость их работы.

Функции работы с потоками - C++
На WInAPI есть функции приостановление и восстановление потоков - SuspendThread() и ResumeThread() Вопрос:есть ли что нибудь подобное в...

Принцип работы функции - C++
Помогите, пожалуйста, разобраться в принципе работы функции //Функция находит самую длинную неубывающую подпоследовательность void...

функции работы с памятью - C++
нужно реализовать свою функцию memcpy. #include &lt;iostream&gt; using std::cout; using std::endl; using std::cin; void*...

функции работы со стеком - C++
необходимо написать стек..и реализовать функции добавления элементов; просмотра; удаления элемента по правилам стека; удаление...


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

Или воспользуйтесь поиском по форуму:
hoggy
6431 / 2649 / 460
Регистрация: 15.11.2014
Сообщений: 5,838
Завершенные тесты: 1
19.09.2015, 11:28     Скорость работы функции #12
Цитата Сообщение от bob2015 Посмотреть сообщение
Почему же не умеет? В чем ошибка? На моем ПК он делает то, что мне надо.
потому что изначально вы хотели:

Цитата Сообщение от bob2015 Посмотреть сообщение
Требуется измерить скорость работы функции "func". При этом измерение должно производиться в течении только TIME_TEST секунд.
ваш код этим не занимается.

он занимается запуском функции в цикле в течении некоторого периода времени:
C++
1
2
3
4
5
while(time(0) < timer)
    {
        func(data);
        count++;
    }
то есть он выполняет совсем не ту задачу,
которая была описана вами в нульпусте.
Yandex
Объявления
19.09.2015, 11:28     Скорость работы функции
Ответ Создать тему
Опции темы

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