Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
1 / 1 / 1
Регистрация: 18.09.2015
Сообщений: 26

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

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

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

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

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

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

Добавлено через 51 секунду
И почему вставка пустого цикла (после которого комментарий "delete") решает эту проблему?
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
18.09.2015, 21:13
Цитата Сообщение от bob2015 Посмотреть сообщение
Что значит "слишком низкое разрешение"? Можно поподробнее?
Грубо говоря, значение time(0) меняется раз в секунду, значение clock(), как я понимаю, раз в процессорный такт.

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

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

В тех двух строчках (//delete) Вы добиваетесь того, что функция продолжит работу почти что в тот момент, когда секунда перепрыгнула. То есть длительность работы функции будет стремиться к единице.
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.09.2015, 21:21
Значит, что этот таймер выдаёт секунды (хотя и не гарантировано) и интервал твой секунда. Ты можешь начать измерения в начале какой-то секунды, в середине или в самом конце, когда уже следующая начинается. Соответственно, твоя функция будет вызвана большее число раз или меньшее, а может вообще ни разу. Если в интервале от 34-й строки до начала условия в 36-й секунда сменится, то функция вообще ни разу не будет вызвана, потому что ты разницу задаёшь слишком маленькую. Время измерения у тебя равно шагу таймера, и те 2 строчки пытаются синхронизировать начала измерения с таймером, с началом очередной секунды.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.09.2015, 22:55
Цитата Сообщение от bob2015 Посмотреть сообщение
3) Как бы Вы написали функцию измерения скорости работы функции в течении заданного времени?
никак. затея изначально фейловая.
ваш код кстати, так же не умеет этого делать.
0
1 / 1 / 1
Регистрация: 18.09.2015
Сообщений: 26
19.09.2015, 01:09  [ТС]
Почему же не умеет? В чем ошибка? На моем ПК он делает то, что мне надо.
0
21 / 22 / 7
Регистрация: 04.08.2015
Сообщений: 131
19.09.2015, 01:30
маленький совет - померьте время до вызовов функции и после, посчитайте интервал, число вызовов вы знаете, скорость работы найти легко, но вообще согласен с hoggy, затея бредовая, проще посмотреть код в ассемблере и ручками посчитать сколько требуется на выполнение функции
0
1 / 1 / 1
Регистрация: 18.09.2015
Сообщений: 26
19.09.2015, 01:43  [ТС]
Цитата Сообщение от Andrew Sinjagin Посмотреть сообщение
маленький совет - померьте время до вызовов функции и после, посчитайте интервал, число вызовов вы знаете, скорость работы найти легко, но вообще согласен с hoggy, затея бредовая, проще посмотреть код в ассемблере и ручками посчитать сколько требуется на выполнение функции
Ну вы объясните почему бредовая) И почему это бредовая затея у меня работает? Руками считать можно, если одна функция, а если их тысяча?

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

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

Цитата Сообщение от bob2015 Посмотреть сообщение
Причем эти функции (тысячу) нужно протестировать по секунде на каждую, а не по 1000.
Как сказал pav1uxa, используйте clock(), иначе вы получите полнейшую ерунду, которая будет зависеть от фазы луны и пятен на солнце
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
19.09.2015, 08:22
Цитата Сообщение от Andrew Sinjagin Посмотреть сообщение
посмотреть код в ассемблере и ручками посчитать сколько требуется на выполнение функции
Это тоже бредовая идея, если говорить о процессорах в ПК. Для многих команд нет точных данных о времени выполнения, оно может зависеть от конкретных операндов, плюс всякие оптимизации.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.09.2015, 11:28
Цитата Сообщение от bob2015 Посмотреть сообщение
Почему же не умеет? В чем ошибка? На моем ПК он делает то, что мне надо.
потому что изначально вы хотели:

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

он занимается запуском функции в цикле в течении некоторого периода времени:
C++
1
2
3
4
5
while(time(0) < timer)
    {
        func(data);
        count++;
    }
то есть он выполняет совсем не ту задачу,
которая была описана вами в нульпусте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.09.2015, 11:28
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru