С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

18.09.2015, 09:11. Просмотров 421. Ответов 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).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2015, 09:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Скорость работы функции (C++):

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

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

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

Расположение файлов библиотек и скорость работы - C++
Заметил, что после того, как я переложил файлы различный библиотек(boost, sfml, glew и т.д.) в папку DEBUG из корневого каталога моей...

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

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

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

Добавлено через 51 секунду
И почему вставка пустого цикла (после которого комментарий "delete") решает эту проблему?
0
pav1uxa
1847 / 1700 / 644
Регистрация: 23.01.2014
Сообщений: 6,079
Завершенные тесты: 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) Вы добиваетесь того, что функция продолжит работу почти что в тот момент, когда секунда перепрыгнула. То есть длительность работы функции будет стремиться к единице.
1
nmcf
5696 / 5007 / 1710
Регистрация: 14.04.2014
Сообщений: 20,443
18.09.2015, 21:21 #5
Значит, что этот таймер выдаёт секунды (хотя и не гарантировано) и интервал твой секунда. Ты можешь начать измерения в начале какой-то секунды, в середине или в самом конце, когда уже следующая начинается. Соответственно, твоя функция будет вызвана большее число раз или меньшее, а может вообще ни разу. Если в интервале от 34-й строки до начала условия в 36-й секунда сменится, то функция вообще ни разу не будет вызвана, потому что ты разницу задаёшь слишком маленькую. Время измерения у тебя равно шагу таймера, и те 2 строчки пытаются синхронизировать начала измерения с таймером, с началом очередной секунды.
1
hoggy
6724 / 2909 / 499
Регистрация: 15.11.2014
Сообщений: 6,550
Завершенные тесты: 1
18.09.2015, 22:55 #6
Цитата Сообщение от bob2015 Посмотреть сообщение
3) Как бы Вы написали функцию измерения скорости работы функции в течении заданного времени?
никак. затея изначально фейловая.
ваш код кстати, так же не умеет этого делать.
0
bob2015
1 / 1 / 1
Регистрация: 18.09.2015
Сообщений: 26
19.09.2015, 01:09  [ТС] #7
Почему же не умеет? В чем ошибка? На моем ПК он делает то, что мне надо.
0
Andrew Sinjagin
20 / 21 / 3
Регистрация: 04.08.2015
Сообщений: 129
19.09.2015, 01:30 #8
маленький совет - померьте время до вызовов функции и после, посчитайте интервал, число вызовов вы знаете, скорость работы найти легко, но вообще согласен с hoggy, затея бредовая, проще посмотреть код в ассемблере и ручками посчитать сколько требуется на выполнение функции
0
bob2015
1 / 1 / 1
Регистрация: 18.09.2015
Сообщений: 26
19.09.2015, 01:43  [ТС] #9
Цитата Сообщение от Andrew Sinjagin Посмотреть сообщение
маленький совет - померьте время до вызовов функции и после, посчитайте интервал, число вызовов вы знаете, скорость работы найти легко, но вообще согласен с hoggy, затея бредовая, проще посмотреть код в ассемблере и ручками посчитать сколько требуется на выполнение функции
Ну вы объясните почему бредовая) И почему это бредовая затея у меня работает? Руками считать можно, если одна функция, а если их тысяча?

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

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

Цитата Сообщение от bob2015 Посмотреть сообщение
Причем эти функции (тысячу) нужно протестировать по секунде на каждую, а не по 1000.
Как сказал pav1uxa, используйте clock(), иначе вы получите полнейшую ерунду, которая будет зависеть от фазы луны и пятен на солнце
0
nmcf
5696 / 5007 / 1710
Регистрация: 14.04.2014
Сообщений: 20,443
19.09.2015, 08:22 #11
Цитата Сообщение от Andrew Sinjagin Посмотреть сообщение
посмотреть код в ассемблере и ручками посчитать сколько требуется на выполнение функции
Это тоже бредовая идея, если говорить о процессорах в ПК. Для многих команд нет точных данных о времени выполнения, оно может зависеть от конкретных операндов, плюс всякие оптимизации.
0
hoggy
6724 / 2909 / 499
Регистрация: 15.11.2014
Сообщений: 6,550
Завершенные тесты: 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++;
    }
то есть он выполняет совсем не ту задачу,
которая была описана вами в нульпусте.
0
19.09.2015, 11:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2015, 11:28
Привет! Вот еще темы с ответами:

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

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

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

Определить типы и функции; в функции main() реализовать демонстрацию работы - C++
Определите структуру TreeNode – узел дерева: struct TreeNode { char name; //имя узла TreeNode * nodes; //список дочерних узлов ...


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

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

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