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

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

Восстановить пароль Регистрация
 
bob2015
1 / 1 / 1
Регистрация: 18.09.2015
Сообщений: 26
18.09.2015, 09:11     Скорость работы функции #1
Требуется измерить скорость работы функции "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).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
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
1710 / 1550 / 599
Регистрация: 23.01.2014
Сообщений: 5,601
Завершенные тесты: 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
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
18.09.2015, 21:21     Скорость работы функции #5
Значит, что этот таймер выдаёт секунды (хотя и не гарантировано) и интервал твой секунда. Ты можешь начать измерения в начале какой-то секунды, в середине или в самом конце, когда уже следующая начинается. Соответственно, твоя функция будет вызвана большее число раз или меньшее, а может вообще ни разу. Если в интервале от 34-й строки до начала условия в 36-й секунда сменится, то функция вообще ни разу не будет вызвана, потому что ты разницу задаёшь слишком маленькую. Время измерения у тебя равно шагу таймера, и те 2 строчки пытаются синхронизировать начала измерения с таймером, с началом очередной секунды.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 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
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
19.09.2015, 08:22     Скорость работы функции #11
Цитата Сообщение от Andrew Sinjagin Посмотреть сообщение
посмотреть код в ассемблере и ручками посчитать сколько требуется на выполнение функции
Это тоже бредовая идея, если говорить о процессорах в ПК. Для многих команд нет точных данных о времени выполнения, оно может зависеть от конкретных операндов, плюс всякие оптимизации.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2015, 11:28     Скорость работы функции
Еще ссылки по теме:

Улучшить скорость работы хэш-таблицы C++
Скорость работы функции pow C++
Потестируйте скорость работы класса больших чисел C++

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

Или воспользуйтесь поиском по форуму:
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 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     Скорость работы функции
Ответ Создать тему
Опции темы

Текущее время: 08:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru