Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> virtual function, почему не делать всегда  
:(
    Опции темы
sergioK1
Дата 14.7.2013, 21:21 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(volatile @ 14.7.2013,  09:56)
Цитата(sergioK1 @  14.7.2013,  06:48 Найти цитируемый пост)
вызов виртуал функции дороже чем обычной - чушь   
Даже обсуждать лень, 

Этот вопрос (слава богу!) не нужно обсуждать. Достаточно просто измерить:
Код

Times for:
virtual function = 70.0,  plain function = 10.0
virtual function = 80.0,  plain function = 10.0
virtual function = 90.0,  plain function = 10.0

http://codepad.org/J9Vb0nl9
На домашней машине, при полной оптимизации, виртуальная функция в среднем в 5 раз медленее чем простая.

угу на вебе  smile  и в 10 раз быстрее ,  там девация 0 вас не это смущает, мне кажеться что 
там интерпритатор , который имулирует компиляцию 
Я измерил открыл Code Block c gcc хотя надо бы в студии но ее счас нетy,
Код

Times for:
virtual function = 173.0,  plain function = 157.0
virtual function = 162.0,  plain function = 152.0
virtual function = 167.0,  plain function = 165.0

sum = 1863248640

Process returned 0 (0x0)   execution time : 1.005 s
Press any key to continue.



проделал раз 10 максимум что удалось получить это 192,0 vs 158.0

на 11раз получил 

Times for:
virtual function = 172.0,  plain function = 182.0
virtual function = 158.0,  plain function = 147.0
virtual function = 160.0,  plain function = 150.0

sum = 1863248640

Process returned 0 (0x0)   execution time : 0.995 s
Press any key to continue.


потом проверил еще пару раз и вот 
Times for:
virtual function = 177.0,  plain function = 161.0
virtual function = 189.0,  plain function = 205.0

virtual function = 170.0,  plain function = 162.0

sum = 1863248640

Process returned 0 (0x0)   execution time : 1.091 s
Press any key to continue

т,е мы видим что разницы нет , 


mes ,
сказал  ответили что ставять inline smile  это раз и пишут на С это два ,
вызов VF в сpp это сишный вызов поинтера на функцию ,  хотя там где critical necessary компайлеру лучше не доверяться а делать самому, классический пример "умная пуля" , 

Я говорил про бизнес  обьекты, с "тупо везде" перегнул,  у вас скорее конвертер который вообще должен быть static ,
IMHO,





Это сообщение отредактировал(а) sergioK1 - 14.7.2013, 21:27
PM MAIL   Вверх
NoviceF
Дата 14.7.2013, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



не знаю, где в креаторе наболтать оптимизацию, но по дефолту на нетбуке цифры такие

Times for:
virtual function = 300.0,  plain function = 50.0
virtual function = 300.0,  plain function = 50.0
virtual function = 300.0,  plain function = 50.0


sergioK1, релиз запусти, а не дебаг.
PM MAIL   Вверх
sergioK1
Дата 14.7.2013, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(NoviceF @ 14.7.2013,  20:42)
не знаю, где в креаторе наболтать оптимизацию, но по дефолту на нетбуке цифры такие

Times for:
virtual function = 300.0,  plain function = 50.0
virtual function = 300.0,  plain function = 50.0
virtual function = 300.0,  plain function = 50.0


sergioK1, релиз запусти, а не дебаг.

Да в дебаге без разницы в релизе в 4раза
И не помогает оптимизация , Страустроп пишет что разница  не значительная  ,
он не знает С++ ??? 

PM MAIL   Вверх
bsa
Дата 14.7.2013, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



sergioK1, что такое вызвать функцию? Это делает инструкция call <address>. Она есть практически в любом процессоре. Но в некоторых РИСКах ее может не быть, тогда это делается вручную: адрес возврата записывается в стек, указатель стека смещается на размер адреса возврата, происходит загрузка в указатель команд адреса процедуры.
Когда имеется вызов виртуальной функции, то тут все сложнее: сохранить адрес возврата, сместить указатель вершины стека, загрузить адрес процедуры в указатель команд, загрузить адрес таблицы виртуальных функций, добавить смещение, загрузить адрес функции.
А теперь вспомним, что на С++ пишут в основном не под микроконтроллеры, а под "большие" машины архитектуры x86 (или x86_64). Чем она отличается? А тем, что кроме всего вышеперечисленного есть кэш и многостадийный конвеер. Таким образом, если производится одновременная работа с большим количеством данных, то кэш начинает тормозить весь процесс - происходят постоянно промахи и приходится заменять одни данные другими. А вот конвеер спотыкается на переходах. И, есть у меня подозрение, что их предсказатель далеко не всегда успешно справляется при вызове виртуальных функций, так как в момент принятия решения адрес перехода может фактически отсутствовать в доступности процессора. А если предсказание перехода завершилось неудачей, то после выявления этого весь конвеер будет сброшен и процессор "потеряет" более десятка тактов...

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

Главная философия языка "не делать то, о чем не просили".

Если ты хочешь переопределить у стека метод reserve (нахрена?), то сделай это путем агрегации (сделай свой стек, который содержит в себе стандартный). Все равно, все члены класса приватные и ты из потомка к ним доступа не получишь.
Если ты хочешь изменить аллокатор, то может стоит именно это и сделать? Посмотри на второй параметр шаблона.

И не забывай, что все стандартные контейнеры самодостаточны. Их не требуется как-то "дореализовывать".

Кстати, то что какие-то части стандартной библиотеки писали "студенты" не означает, что это студенты проектировали. В комитете по стандартизации сидят довольно серьезные люди.
PM   Вверх
sergioK1
Дата 14.7.2013, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



volatile 
NoviceF

Это обман трудящихся   smile  разбейте все по отдельным файлам , 
у меня даже 1% разницы нет , 

Это сообщение отредактировал(а) sergioK1 - 16.7.2013, 20:38
PM MAIL   Вверх
CosmoMan
Дата 29.7.2013, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 12.7.2005
Где: Харьков

Репутация: -1
Всего: 0



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

Я считаю, что делать все функции виртуальными - это лишнее.
Но думаю не помешал бы блок вроде public virtual:
PM MAIL   Вверх
volatile
Дата 29.7.2013, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(sergioK1 @  14.7.2013,  23:46 Найти цитируемый пост)
Это обман трудящихся     разбейте все по отдельным файлам , 
у меня даже 1% разницы нет , 

sergioK1,  тут уже говорилось что код нужно проверять на максимальной оптимизации на скорость.
То что у вас скорость зависит от "разбиения на файлы", говорит лишь о том что у вас не включен элементаный
link-time code generation.

Да и потом изучайте мат-часть.
То что вирт. функция будет медленней - даже спорить смешно.

PM MAIL   Вверх
sergioK1
Дата 29.7.2013, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(volatile @ 29.7.2013,  12:08)
То что у вас скорость зависит от "разбиения на файлы", говорит лишь о том что у вас не включен элементаный
link-time code generation.

Да и потом изучайте мат-часть.
То что вирт. функция будет медленней - даже спорить смешно.

где его включать? 

вопрос неправильно  ставите(это масчеи матчасти  smile )  не virtual vs regular , 
а static call vs dynamic call , т,е вопрос можно ли оптимизировать что-бы был статик?
в чистом С это можно(судя по тестам), почему в С++ нет ? 


PM MAIL   Вверх
volatile
Дата 29.7.2013, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(sergioK1 @  29.7.2013,  13:28 Найти цитируемый пост)
можно ли оптимизировать что-бы был статик?
в чистом С это можно(судя по тестам), почему в С++ нет ? 

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

В случае не вирт. функции, никакого вычисления в ран-тайме НЕ нужно.
Все известно на момент компиляции. И компилятор просто подставляет жесткий адрес функции.

PM MAIL   Вверх
mes
Дата 29.7.2013, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  29.7.2013,  13:01 Найти цитируемый пост)
Нигде нельзя. 

если известен тип, с++ позволяет оптимизировать виртуальный вызов..


--------------------
PM MAIL WWW   Вверх
volatile
Дата 29.7.2013, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(mes @  29.7.2013,  15:38 Найти цитируемый пост)
если известен тип, с++ позволяет оптимизировать виртуальный вызов.. 

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

Добавлено через 2 минуты и 37 секунд
Естествеено, если взять пример с одним типом, как код выше, ясно что там другого просто не будет.
В реальных программах (сколько нибудь сложных) - так не бывает.


PM MAIL   Вверх
mes
Дата 29.7.2013, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  29.7.2013,  14:50 Найти цитируемый пост)
Если известен тип, тогда смысла в виртуальной функции нет.

зато есть смысл в оптимизации такого вызова smile


Цитата(volatile @  29.7.2013,  14:50 Найти цитируемый пост)
Естествеено, если взять пример с одним типом, как код выше, ясно что там другого просто не будет.
В реальных программах (сколько нибудь сложных) - так не бывает.

зато бывает в тестах, что мешает некоторым (как например тс)  адекватно оценить затраты на виртуальность..

Добавлено через 2 минуты и 23 секунды
Цитата(volatile @  29.7.2013,  14:50 Найти цитируемый пост)
В реальных программах (сколько нибудь сложных) - так не бывает.

и все ж бывает..

Это сообщение отредактировал(а) mes - 29.7.2013, 16:04


--------------------
PM MAIL WWW   Вверх
volatile
Дата 29.7.2013, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Аналогично, можно еще очень сильно настаивать на том, что скорость умножения, вообще не имеет значения в программировании
основываясь на том что высосанный из пальца тестовый код  выполняется моментально:
Код

а = 2 * 2;


Да здесь не будет умножения в ран-тайме, но это вовсе не означает что можно теперь плевать на скорость умножения.
Да бывает что так пишут. Но это капля в море. и вообще не о том речь.

Добавлено через 3 минуты и 54 секунды

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

Там гораздо надежнее получите высокооптимизированный код

PM MAIL   Вверх
mes
Дата 29.7.2013, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  29.7.2013,  15:29 Найти цитируемый пост)
Так - же и с вашими оптимизациями вирт.функций.
Там где их компилятор сможет оптимизировать, там вообще не нужно виртализация.
И лучше рассмотеть использвание шаблонов!

как по мне тут соленное с влажным сравнивается.. 


--------------------
PM MAIL WWW   Вверх
volatile
Дата 29.7.2013, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(mes @  29.7.2013,  18:27 Найти цитируемый пост)
как по мне тут соленное с влажным сравнивается..  

Вот здесь люди тоже сравнивают :
Сравнение влажного с соленым
есть и еще с десяток тысяч линков, найдете без труда в гугле...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0913 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.