о стоимости виртуальной функции

Вы можете или не могли уже встретиться часто порочивший, но все еще полезный UCD (Пользователь Центрируемый Дизайн) ( далее . ссылки .), который исторически был полезен для более... монолитных приложений, действуя 1:1 с людьми. Тем не менее UCD является повторяющимся, и поэтому отображается хорошо на гибкую методологию.

В возрасте социальной сети, очень социалистическое возникновение Теория Действия - свободно, все поведение человека может быть понято в контексте общественных действий, отклонение внутренних миров Фрейда и jung - делает успехи из-за, это - очевидный перевод. Хорошее введение с прошлых лет FOWA здесь , текст на предмете здесь .

я думаю, что это собирается продолжать делать успехи, потому что ясно Интернет теперь определяет будущее программного обеспечения, и Интернет является социальной средой. То, что имеет значение, осмысляет отношения и пользовательские действия в группе, меньше литеральные бизнес-объекты.

9
задан fulmicoton 18 August 2009 в 09:03
поделиться

5 ответов

Компилятор Visual C ++ (по крайней мере, до VS 2008) не кэширует поиск по vtable. Еще более интересно то, что он не выполняет прямую отправку вызовов виртуальным методам, где статический тип объекта запечатан . Однако фактические накладные расходы на поиск виртуальной диспетчеризации почти всегда незначительны. Место, где вы иногда видите попадание, заключается в том, что виртуальные вызовы в C ++ не могут быть заменены прямыми вызовами, как в управляемой виртуальной машине. Это также означает отсутствие встраивания для виртуальных вызовов.

Единственный верный способ определить влияние вашего приложения - это использовать профилировщик.

Относительно специфики вашего исходного вопроса: если виртуальный метод, который вы вызываете, достаточно тривиален, что сама виртуальная диспетчеризация вызывает измеримую производительность воздействия, то этот метод достаточно мал, чтобы vtable оставалась в кэше процессора на протяжении всего цикла. Несмотря на то, что инструкции сборки для извлечения указателя функции из vtable выполняются 1000 раз, влияние на производительность будет намного меньше, чем (1000 * время для загрузки vtable из системной памяти) .

тогда этот метод достаточно мал, чтобы vtable оставалась в кэше процессора на протяжении всего цикла. Несмотря на то, что инструкции сборки для извлечения указателя функции из vtable выполняются 1000 раз, влияние на производительность будет намного меньше, чем (1000 * время для загрузки vtable из системной памяти) .

тогда этот метод достаточно мал, чтобы vtable оставалась в кэше процессора на протяжении всего цикла. Несмотря на то, что инструкции сборки для извлечения указателя функции из vtable выполняются 1000 раз, влияние на производительность будет намного меньше, чем (1000 * время для загрузки vtable из системной памяти) .

6
ответ дан 4 December 2019 в 10:33
поделиться

Компилятор может оптимизировать его - например, следующее (по крайней мере, концептуально) легко оптимизировано:

Foo * f = new Foo;
for ( int i = 0; i < 1000; i++ ) {
   f->func();
}

Однако другие случаи более сложны:

vector <Foo *> v;
// populate v with 1000 Foo (not derived) objects
for ( int i = 0; i < v.size(); i++ ) {
   v[i]->func();
}

те же концептуальные оптимизация применима, но компилятору гораздо сложнее ее увидеть.

Итог - если вам это действительно интересно, скомпилируйте свой код со всеми включенными оптимизациями и проверьте вывод ассемблера компилятора.

8
ответ дан 4 December 2019 в 10:33
поделиться

Если компилятор может сделать вывод, что объект, для которого вы вызываете виртуальную функцию, не изменяется, тогда, теоретически , он должен иметь возможность поднять Поиск vtable вне цикла.

Вы можете узнать, действительно ли ваш конкретный компилятор это делает, только взглянув на код сборки, который он производит.

3
ответ дан 4 December 2019 в 10:33
поделиться

Я думаю, что проблема не в поиске vtable, поскольку это очень быстрая операция, особенно в цикле, где у вас есть все требуемые значения в кеше (если цикл не слишком сложный, но если он сложный, виртуальная функция не сильно повлияет на производительность). Проблема заключается в том, что компилятор не может встроить эту функцию во время компиляции.

Это особенно проблема, когда виртуальная функция очень мала (например, возвращает только одно значение). Относительное влияние на производительность в этом случае может быть огромным, потому что вам нужен вызов функции, чтобы просто вернуть значение. Если эта функция может быть встроена, это значительно улучшит производительность.

Если виртуальная функция потребляет производительность, то мне наплевать на vtable.

1
ответ дан 4 December 2019 в 10:33
поделиться

Я бы сказал, это зависит от вашего компилятора, а также от внешнего вида цикла. Оптимизация компиляторов может многое сделать для вас, и если VF-вызов предсказуем, компилятор может вам помочь. Может быть, вы найдете что-нибудь об оптимизации, выполняемой вашим компилятором, в документации по компилятору.

0
ответ дан 4 December 2019 в 10:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: