2014-11-14 3 views
1

При профилировании моего приложения в Visual Studio 2013 (возможно, это относится и к другим версиям), я заметил, что приложение использует циклы при вводе/выводе метода. Откуда берутся эти циклы, и как я могу их устранить в конечном итоге?Метод ввода-вывода выборки Visual Studio

Ниже приведен пример профилирующего сеанса, который я недавно сделал. В то время как проценты довольно низки (0,9% и < 0,1%) на этом скриншоте, я испытал, что он колеблется от 0% до 25% за метод.

sample profile

Или

enter image description here

ответ

2

Эти циклы могут исходить от вызова конструкторов/деструкторов локальных объектов.

Чтобы проверить эту теорию, можно создать класс, что г UNS вычислительный цикл в деструкторе и убедитесь, что компилятор не оптимизирует его прочь. Затем в вашем функциональном коде создайте объект этого класса в стеке (не выделяя его динамически). Когда функция выйдет, вызывается деструктор локального объекта, таким образом - ваш цикл. Вы должны увидеть согласованное количество циклов.

Также Передача/извлечение аргументов и сохранение стека в соответствии с соглашениями о вызовах может добавить еще несколько циклов при входе и выходе.

Если вы получаете 25% значений, это, вероятно, потому, что у вас мало работы в теле функции.

+0

Должен ли я видеть процент на линии, которая вызывает фактическую нагрузку? Например. 'T :: GetTypeId', который использует copy/move, вызывает выделение одной и той же строки, а не первую скобку метода? – Caramiriel

+0

Вы можете попробовать и разделить линию возврата в 2. Сделайте временную переменную, являющуюся результатом getComponent (T :: ...), а во второй строке верните ее с помощью статического броска. – VAndrei

+0

Пока все хорошо, но все равно 0.5% при входе/выходе (см. Дополнительный снимок экрана в OP). Откуда это происходит (просто заинтересованы в этом, надеюсь, вы не против)? – Caramiriel

Смежные вопросы