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

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

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

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

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

Хочу оптимизировать свой код и найти самые медленные места
Можно как то измерить к примеру сколько времени занимает выполнение отдельного цикла или функции ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2009, 05:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как измерить скорость работы кода (C++):

Можно ли измерить время работы участка кода в тактах процессора? - C++
Если да, то подскажите способ. Важно что бы при измерениях не мерились службы и процессы винды и всего остального.

Как измерить потраченное время на выполнение кода - C++
Нужно измерить время затраченное на выполнене функции. Кто что посоветует? Решил так: LARGE_INTEGER time_n,time_s,freq; ...

Как измерить время выполнения отдельного участка кода? - C++
Собственно возник вопрос, каким образом измерить время выполнения того или инного учатска кода?(На винде)

Как измерить время работы программы по сортировке массива? - C++
Общая схема программы Х выглядит следующим образом. а. Выбрать очередной размер массива исходных данных. б. Заполнить массив...

Измерить скорость воздушного потока - C++
1. Нужно сделать программу, в начале которой запускался бы таймер и программа работала бы бесконечно. 2. Нужно измерить скорость...

Измерить время выполнения кода - C++
В C# такая классная вещь есть - Stopwatch, которая могла время измерять. В C++ же кроме clock() из хэдера ctime (что не очень удобно) я...

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

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

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

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

конечно, оптимизировать некритические куски кода не к чему, но с другой стороны порой без оптимизации не обойтись. может, товарищ, nill микроконтроллеры программирует и хочет разбор кадров производить в обработчике прерываний, да так чтобы кадры не терять.
есть много областей применения языка С/С++ где счёт идёт на микросекунды и процы с тактовой до сотни мегагерц, вот там неоптимально написанный код может сделать большой "Упс!!".
0
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
24.11.2009, 13:45  [ТС] #6
CheshireCat
конечно я подумал о том нужна ли она вообще в первую очередь зачем тратить время на что то ненужное
код работает правильно но очень медленно из за кучи вложенных циклов и это на 3гигагерц
я конечно исправляю и удаляю где что могу но хотелось бы понять где самое слабое место по времени его выполнения
вобщем хотелось бы увидеть пример а то пока ничего конкретного
если конечно это вообще возможно измерять время выполнения отдельных участков кода
0
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;
}
1
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) )
0
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
24.11.2009, 14:37 #9
TanT,
пример из вики нормально прошёл, а вашим кодом давиться вижуал

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

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

по UnitTest++ я вообще не понял как его использовать
а по Intel Vtune плохие отзывы и советуют вместо него AutomatedQA AQTime
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2009, 02:02
Привет! Вот еще темы с ответами:

Подскажите, как сократить время работы кода? Проверка на простое число - C++
#include &lt;iostream&gt; using namespace std; int main() { int x, k = 0; cin &gt;&gt; x; for (int i = 1; i &lt;= x;...

Скорость кода - C++
Подскажите, пожалуйста, компилятор, который обеспечивает наибольшую скорость выполнения кода.

Как измерить время - C++
Здравствуйте! В программе на С(Borland С) необходимо знать, за какое время выполняется программа. Т.е. открывает программу, нажимаем...

Как измерить длину файла? - C++
Как измерить длину файла?


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
25.11.2009, 02:02
Ответ Создать тему
Опции темы

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