Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Время выполнения подпрограммы / 11 сообщений из 11, страница 1 из 1
15.04.2013, 12:35
    #38225667
pol_ar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время выполнения подпрограммы
Добрый день.
Подскажите, пожалуйста, как можно оценить время выполнения некоторого кода.

Допустим, есть конструкция1 вида:
if (x > 5) y = 1;
if (x > 10) y = 0;

И есть конструкция2 вида:
if (x > 5) y = 1;
else y = 0;

Или даже так:
y = (x > 10) ? 0 : 1;

Какая из них выполняется быстрее? И, главное, как это можно посчитать (в тактах процессора). Есть ли какой-то плагин для Visual Studio, где это можно сделать?
...
Рейтинг: 0 / 0
15.04.2013, 12:47
    #38225699
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время выполнения подпрограммы
pol_ar,

Начнем ст того что не все из этих конструкций делают то же самое :)

Насчет плагина не в курсе.
Но хочу обратить ваше внимание, что на современных процессорах большинство команд выполняются не фиксированное, а переменное число тактов, в зависимости от того закешированы ли данные, и многих других факторов.
Более того во многих случаях для подсчета суммарного числа тактов последовательно идущих команд некорректно просто их просуммировать, т.к. часто последовательные команды выполняются параллельно или частично параллельно.

Ну и для этих двух вариантов скорее всего будет сгенерирован один и тот же маш. код (если абстрагироваться от конкретных констант):
Код: plaintext
1.
2.
3.
4.
if (x > 5) y = 1;
else y = 0;

y = (x > 10) ? 0 : 1;


А эта комбинация скорее всего будет медленнее других из-за двух условий
Код: plaintext
1.
2.
if (x > 5) y = 1;
if (x > 10) y = 0;


т.к. каждое условие повышает вероятность сброса конвейера, за счет загрузки которого и организуется параллельное исполнение команд.
...
Рейтинг: 0 / 0
15.04.2013, 13:14
    #38225771
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время выполнения подпрограммы
Ну и с точки зрения оценок производительности все варианты кода -- это O(1), т.е. оценка времени выполнения одинакова.
...
Рейтинг: 0 / 0
15.04.2013, 13:21
    #38225789
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время выполнения подпрограммы
pol_arКакая из них выполняется быстрее? И, главное, как это можно посчитать (в тактах процессора). Есть ли какой-то плагин для Visual Studio, где это можно сделать?
Твой вопрос на мильён багсов. В целом - никак. Время работы куска кода зависит от разных
условий. От компиллятора. От того что делает в данный момент твоя ОС e.t.c. И даже от
того первый раз запущен фрагмент или многократно.

В твоем случае лучше всего запускать его в цикле (10000000 раз) и фиксировать среднее
время.

В старое время можно было взять этот-же код в виде ассемблера и посчитать каждую
команду в виде количества тактов. Но сейчас эта методика ущербна ввиду сложности
работы современных процессоров.
...
Рейтинг: 0 / 0
15.04.2013, 13:31
    #38225818
pol_ar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время выполнения подпрограммы
Anatoly Moskovskypol_ar,
Начнем ст того что не все из этих конструкций делают то же самое :)
...
А эта комбинация скорее всего будет медленнее других из-за двух условий


Благодарю за быстрые ответы. Была когда-то у меня табличка для процессора Z80, там время выполнения каждой инструкции было указано в тактах. Можно было посчитать с точностью до 1 такта. Вот это имелось ввиду. И я вижу уже ниже еще одно сообщение от нашего коллеги по форуму. Спасибо вам за ответы.
...
Рейтинг: 0 / 0
15.04.2013, 15:05
    #38225996
pol_ar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время выполнения подпрограммы
Добавлю ссыль на инструмент в составе Visual Studio. Это еще не подсчет тактов, но помогает увидеть дизассемблер (а значит и посчитать такты при наличии таблиц).
http://www.c-sharpcorner.com/uploadfile/ae35ca/disassemble-code-in-visual-studio-instead-of-ildsam-disassembler/ Думаю, что с этой ссылкой тема топика становится исчерпанной.
...
Рейтинг: 0 / 0
15.04.2013, 15:13
    #38226011
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время выполнения подпрограммы
если задача практическая -- выполняем нужный участок кода в цикле много раз, на данных близких к реальным, так чтоб оно несколько сек выполнялось, и считаем сколько раз оно выполнилось.
потом ставим в цикл другую конструкцию и тоже считаем.
и так несколько раз.
...
Рейтинг: 0 / 0
15.04.2013, 16:16
    #38226162
pol_ar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время выполнения подпрограммы
Еще одну ссыль, с вашего позволения. Больно хороша ссыль. Надеюсь, я не нарушаю правил форума. В случае чего, прошу великодушно простить.))
В продолжение этой темы обсуждение вопроса о подсчете числа тактов для выполняемых инструкций процессора. Читать здесь:
http://www.wasm.ru/forum/viewtopic.php?id=8840
...
Рейтинг: 0 / 0
15.04.2013, 16:30
    #38226224
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время выполнения подпрограммы
В режиме профилирования (теоретически) можно видеть время работы процедуры.
Не знаю подойдет-ли это автору.

Вообще данную задачу я-бы не хотел рассматрвиать в вакууме. Обычно ее обрамляет
логика. И это логика влияет в том.числе на оптимизацию и этих строк тоже.
...
Рейтинг: 0 / 0
17.04.2013, 09:32
    #38228521
pol_ar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время выполнения подпрограммы
mayton,

Режим профилирования все же предназначен для больших блоков кода.
Вот скриншот фрагмента кода на C++ (CLI), выдаваемый при отладке Visual Studio. Здесь наглядно видно, сколько памяти жрет код и можно прикинуть время выполнения того или иного участка. Это большой плюс. Ниже (или выше?)) уже только программирование на ассемблере.
...
Рейтинг: 0 / 0
17.04.2013, 11:53
    #38228833
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Время выполнения подпрограммы
pol_arЗдесь наглядно видно, сколько памяти жрет код и можно прикинуть время выполнения того или иного участка. Это большой плюс. Ниже (или выше?)) уже только программирование на ассемблере.
Эта метрика не годится. Никто не оценивает производительность
по объёму кода. Объём выполнимого кода вообще мало
связан со скоростью получения результата.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Время выполнения подпрограммы / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]