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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 51, средняя оценка - 4.84
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
#1

Как измерить скорость работы кода - C++

24.11.2009, 05:33. Просмотров 6598. Ответов 11
Метки нет (Все метки)

Хочу оптимизировать свой код и найти самые медленные места
Можно как то измерить к примеру сколько времени занимает выполнение отдельного цикла или функции ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
24.11.2009, 05:40     Как измерить скорость работы кода #2
оптимизацию можно проводить исследуя ассемлерный код, очь хорошо видно слабые места.
а если требуется посчитать время работы, то можно прогнать ваш цикл без пауз много много раз и засеч время, таймер считает вроде с точностью до милисекунды, тоесть время измерения(зацикливания вашего цикла) хотя бы раз в 10 должно превосходить это время. собственно, потом делишь время измерения на количество циклов и получаешь примерное время работы цикла.
но собственно, если владеешь познаниями в области ассемблера, можно опять же по ассемлерному коду посчитать количество операций и умножить на время выполнения одной операции.
время выполнения напрямую зависит от тактовой частоты вашего процессора.
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
24.11.2009, 05:51  [ТС]     Как измерить скорость работы кода #3
а засечь время это как что за таймер как его поставить в C++?

про ассемблер тоже если можно пример можно ли его вообще в visual studio увидеть этот ассемблер

Хотя конечно хотелось бы самый простой способ с С++
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,345
24.11.2009, 09:50     Как измерить скорость работы кода #4
Цитата Сообщение от nill Посмотреть сообщение
Хочу оптимизировать свой код и найти самые медленные места
А нафига ??? Заказчика не удовлетворяет производительность приложения? Какова "просадка" производительности? 10% ? 20% 300% ? Какова цель оптимизации?
Короче, задумайся о конечной цели. Не нужно оптимизировать то, что оптимизировать не нужно.

Цитата Сообщение от nill Посмотреть сообщение
Можно как то измерить к примеру сколько времени занимает выполнение отдельного цикла или функции ?
Погугли по лексемам "профилировщик", "profiler", "Intel VTune"
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
24.11.2009, 10:50     Как измерить скорость работы кода #5
Цитата Сообщение от CheshireCat Посмотреть сообщение
А нафига ??? Заказчика не удовлетворяет производительность приложения? Какова "просадка" производительности? 10% ? 20% 300% ? Какова цель оптимизации?
Короче, задумайся о конечной цели. Не нужно оптимизировать то, что оптимизировать не нужно.
CheshireCat хочу сказать в защиту nill он же не интересовался: "когда требуется выполнять оптимизацию?" он сказал: "Хочу оптимизировать свой код"

конечно, оптимизировать некритические куски кода не к чему, но с другой стороны порой без оптимизации не обойтись. может, товарищ, nill микроконтроллеры программирует и хочет разбор кадров производить в обработчике прерываний, да так чтобы кадры не терять.
есть много областей применения языка С/С++ где счёт идёт на микросекунды и процы с тактовой до сотни мегагерц, вот там неоптимально написанный код может сделать большой "Упс!!".
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
24.11.2009, 13:45  [ТС]     Как измерить скорость работы кода #6
CheshireCat
конечно я подумал о том нужна ли она вообще в первую очередь зачем тратить время на что то ненужное
код работает правильно но очень медленно из за кучи вложенных циклов и это на 3гигагерц
я конечно исправляю и удаляю где что могу но хотелось бы понять где самое слабое место по времени его выполнения
вобщем хотелось бы увидеть пример а то пока ничего конкретного
если конечно это вообще возможно измерять время выполнения отдельных участков кода
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
24.11.2009, 14:12     Как измерить скорость работы кода #7
Цитата Сообщение от nill Посмотреть сообщение
Хочу оптимизировать свой код и найти самые медленные места
Можно как то измерить к примеру сколько времени занимает выполнение отдельного цикла или функции ?
Да, можно. Разумеется с поправкой на само измерение. Во первых можно погуглить запрос QueryPerformanceFrequency, во вторых использовать Rdtsc.

замечание:
1. QueryPerformanceFrequency имеет очень долгий "оверхед" - порядка 1мкс..
2. Вариант на вики для для MS Visual C++, для g++ будет что-то подобное:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
using namespace std;
static inline unsigned long long int tick() 
{
unsigned long long int d;
__asm__ __volatile__ ("rdtsc" : "=A" (d) );
return d;
}
 
int main()
{
    unsigned long long int a = 0;
    a=tick();
    cout<<endl<<a<<endl;
    a=tick();
    cout<<a<<endl;
    return 0;
}
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
24.11.2009, 14:35     Как измерить скорость работы кода #8
вот и мне сказали как ассемлерный код посмотреть
для вижуал 2008 так
сначала F10, входишь в режим отладки, затем Debug->Windows->Disassembly
потом смотришь каждый свой цикл и по объему кода чётко понимаешь где время теряешь, самый лучший измеритель, ИМХО

Добавлено через 1 минуту
Цитата Сообщение от Vladimir. Посмотреть сообщение
static inline unsigned long long int tick()
{
unsigned long long int d;
__asm__ __volatile__ ("rdtsc" : "=A" (d) );
return d;
}

[/CPP]
пример из вики нормально прошёл, а вашим кодом давиться вижуал
__asm исправил, потом вскобках компилятор начал путаться где-то сдесь ("rdtsc" : "=A" (d) )
Rififi
2336 / 1051 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
24.11.2009, 14:37     Как измерить скорость работы кода #9
TanT,
пример из вики нормально прошёл, а вашим кодом давиться вижуал

потому что этот код не для Visual C++
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,345
24.11.2009, 15:19     Как измерить скорость работы кода #10
Цитата Сообщение от nill Посмотреть сообщение
конечно я подумал о том нужна ли она вообще в первую очередь зачем тратить время на что то ненужное
код работает правильно но очень медленно из за кучи вложенных циклов и это на 3гигагерц
я конечно исправляю и удаляю где что могу но хотелось бы понять где самое слабое место по времени его выполнения
Ага! Вот он - момент истины!
Если код работает правильно, то:
1. обязательно напиши автоматический тест для алгоритма (например, я пользую UnitTest++) - который будет при каждой сборке автоматически проверять, что ты ничего не "сломал" при оптимизации.
2. Начинай не с оптимизации кода, а с оптимизации АЛГОРИТМА! Алгоритмическая оптимизация дает 90% эффекта - или больше, если получится. Нет смысла вылизывать машинные такты в ассемблерном коде, если алгоритм плох.
3. Ну и используй инструменты типа Intel Vtune, он с ходу покажет тебе наиболее "горячие" точки твоего кода... У него триальный период, ежели мой склероз мне не изменяет, 30 дней - вроде бы, хватит....
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
24.11.2009, 16:31     Как измерить скорость работы кода #11
Цитата Сообщение от Rififi Посмотреть сообщение
TanT,
пример из вики нормально прошёл, а вашим кодом давиться вижуал

потому что этот код не для Visual C++
догадался, как его для вижуала переделать. собственно это я хотел узнать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2009, 02:02     Как измерить скорость работы кода
Еще ссылки по теме:

C++ Как измерить длину файла?
C++ Подскажите, как сократить время работы кода? Проверка на простое число
Измерить время выполнения кода C++
C++ Как измерить время сортировки массива?
Как измерить время работы программы по сортировке массива? C++

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

Или воспользуйтесь поиском по форуму:
nill
9 / 9 / 0
Регистрация: 16.08.2009
Сообщений: 417
25.11.2009, 02:02  [ТС]     Как измерить скорость работы кода #12
CheshireCat
скачал AutomatedQA AQTime
вроде то что нужно замерил мне время выполнения для каждой функции, функции с включенными в нее функциями и отдельных срр файлов
измерить выполнение отдельного цикла не нашел как, а хотелось бы

по UnitTest++ я вообще не понял как его использовать
а по Intel Vtune плохие отзывы и советуют вместо него AutomatedQA AQTime
Yandex
Объявления
25.11.2009, 02:02     Как измерить скорость работы кода
Ответ Создать тему
Опции темы

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