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

Поиск:

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


Эксперт
****


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

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



Alexeis, золотые слова
PM   Вверх
xvr
Дата 6.8.2013, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(sergioK1 @  12.7.2013,  19:55 Найти цитируемый пост)
тем более что тормоза по этой причине за которые многие ругали OOP полный миф ,

Гы  smile 
Был случай - одна программа на Java была ускоренна в несколько раз простым прописыванием final ко всем методам всех классов, которые реально не были виртуальными.

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


Опытный
**


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

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



Цитата(xvr @ 6.8.2013,  11:33)
Цитата(sergioK1 @  12.7.2013,  19:55 Найти цитируемый пост)
тем более что тормоза по этой причине за которые многие ругали OOP полный миф ,

Гы  smile 
Был случай - одна программа на Java была ускоренна в несколько раз простым прописыванием final ко всем методам всех классов, которые реально не были виртуальными.


С потоками ? 
Какая  java ? версия ? Желательно код сюда ,
А то  мой телепат в отпуске  smile 
Хотя final или static   в жаве  грузиться заранее это фактически аналог inline ,






Это сообщение отредактировал(а) sergioK1 - 6.8.2013, 14:10
PM MAIL   Вверх
xvr
Дата 6.8.2013, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(sergioK1 @  6.8.2013,  13:29 Найти цитируемый пост)
И при чем тут виртуальность ?

Это отключение виртуальности. Все остальное - это уже последствия.

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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(xvr @  6.8.2013,  14:37 Найти цитируемый пост)
Это отключение виртуальности. Все остальное - это уже последствия.

  Это отключение корявой реализации чего-то вместе с виртуальностью. Сами же виртуальный вызов в С++ почти ничего не стоит. Есть правда еще один минус виртуальности. Компилятор не может выкидывать функции, которые ни где не использовались, если они виртуальные. Зато может инлайнить, если на 100% уверен, что будет вызвана именно эта функция.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bsa
Дата 6.8.2013, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alexeis @  6.8.2013,  15:42 Найти цитируемый пост)
Сами же виртуальный вызов в С++ почти ничего не стоит.
смотря по сравнению с чем. Если сравнивать с простым вызовом подпрограммы, то цена огромна, если с библиотечным вызовом, то сопоставима, если с системным - то пренебрежимо мала.
Касается современного "настольного" процессора с длинным конвейером и предсказателем переходов
PM   Вверх
sergioK1
Дата 6.8.2013, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bsa @ 6.8.2013,  13:50)
Цитата(Alexeis @  6.8.2013,  15:42 Найти цитируемый пост)
Сами же виртуальный вызов в С++ почти ничего не стоит.
смотря по сравнению с чем. Если сравнивать с простым вызовом подпрограммы, то цена огромна, если с библиотечным вызовом, то сопоставима, если с системным - то пренебрежимо мала.
Касается современного "настольного" процессора с длинным конвейером и предсказателем переходов

пример показывай где огромна,  хватит  уже теорий  smile 


Alexeis ,
это установка флага const в поинтер на функцию ,

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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(bsa @  6.8.2013,  15:50 Найти цитируемый пост)
Если сравнивать с простым вызовом подпрограммы

  С этого момента по подробнее. Я где-то раньше читал, что вызов подпрограммы занимает 12 тактов процессора (x86), добавим сюда типичную операцию помещения в стек 1-2х параметров (хз сколько тактов), против дополнительных расходов по извлечению адреса расположенного по фиксированному смещению. По сути 2е операции с памятью. 1я получение адреса VMT, 2я получение адреса функции. Что же здесь такого накладного? Неужели промахи кеша процессора приводят к таким огромным потерям производительности?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bsa
Дата 6.8.2013, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Alexeis, я же написал, смотря с чем сравнивать. Если ты выполняешь какие-то внутренние вычисления и при этом активно используешь виртуальные методы, то производительности ты потеряешь значительную долю. А вот если 90% времени программа "отдыхает" (что-то делает система), то скорее всего, виртуальность вреда существенного не наносит.
PM   Вверх
mes
Дата 6.8.2013, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Alexeis @  6.8.2013,  13:42 Найти цитируемый пост)
 Сами же виртуальный вызов в С++ почти ничего не стоит. 

Цитата(Alexeis @  6.8.2013,  13:42 Найти цитируемый пост)
 Компилятор не может выкидывать функции, которые ни где не использовались, если они виртуальные.

а значит все таки стоят smile

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

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

Это сообщение отредактировал(а) mes - 6.8.2013, 18:41


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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(sergioK1 @  6.8.2013,  15:58 Найти цитируемый пост)
пример показывай где огромна,  хватит  уже теорий

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

class Virtual {
public:
 double some(double v) {return v+1;}
};

double a,b;

double func(Virtual& c)
{
 double acc=0;
 for(int i=0;i<10000000;++i)
  acc+=c.some(pow(a,b));
 return acc;
}
Оптимизатор выкинет все тело цикла, и вернет сразу 10000000*(1+pow(a,b)). Если же функция Virtual::some будет виртуальной - он не сможет сделать ничего - цикл будет крутится 10000000 раз, и pow() вызываться каждый раз

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


Опытный
**


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

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



Цитата(xvr @ 6.8.2013,  21:45)
Цитата(sergioK1 @  6.8.2013,  15:58 Найти цитируемый пост)
пример показывай где огромна,  хватит  уже теорий

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

class Virtual {
public:
 double some(double v) {return v+1;}
};

double a,b;

double func(Virtual& c)
{
 double acc=0;
 for(int i=0;i<10000000;++i)
  acc+=c.some(pow(a,b));
 return acc;
}
Оптимизатор выкинет все тело цикла, и вернет сразу 10000000*(1+pow(a,b)). Если же функция Virtual::some будет виртуальной - он не сможет сделать ничего - цикл будет крутится 10000000 раз, и pow() вызываться каждый раз

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

В  java проверил final эффект нулевой 
PM MAIL   Вверх
xvr
Дата 6.8.2013, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(sergioK1 @  6.8.2013,  23:38 Найти цитируемый пост)
но при нормальном код ревью вы скорее всего оптимизируете алгоритм сами , по крайне мере постараетесь 

Угу, но включенная по умолчанию виртуальность для всех методов будет этому сильно мешать. 

Цитата(sergioK1 @  6.8.2013,  23:38 Найти цитируемый пост)
это сделать если пример будет более сложный,  компилятор не всемогущ и гарантий 100% что он оптимизирует нет

Разумеется, но 100% от него никто и не требует. Иначе не было бы инженеров по performance анализу (а они есть, и немало). Однако, ускорение программы в разы при включении оптимизации вполне рядовая вещь.

Цитата(sergioK1 @  6.8.2013,  23:38 Найти цитируемый пост)
Т,е ,  "проблемв  тормозов" остаюеться в теории, по крайне мере в основном 

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

Цитата(sergioK1 @  6.8.2013,  23:38 Найти цитируемый пост)
В  java проверил final эффект нулевой  

Я не говорил, что это проявится на любой java программе. Я говорил, что такие программы существуют.

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


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


Опытный
**


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

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



Цитата(xvr @ 6.8.2013,  22:51)
Цитата(sergioK1 @  6.8.2013,  23:38 Найти цитируемый пост)
но при нормальном код ревью вы скорее всего оптимизируете алгоритм сами , по крайне мере постараетесь 

Угу, но включенная по умолчанию виртуальность для всех методов будет этому сильно мешать. 

Цитата(sergioK1 @  6.8.2013,  23:38 Найти цитируемый пост)
это сделать если пример будет более сложный,  компилятор не всемогущ и гарантий 100% что он оптимизирует нет

Разумеется, но 100% от него никто и не требует. Иначе не было бы инженеров по performance анализу (а они есть, и немало). Однако, ускорение программы в разы при включении оптимизации вполне рядовая вещь.

Цитата(sergioK1 @  6.8.2013,  23:38 Найти цитируемый пост)
Т,е ,  "проблемв  тормозов" остаюеться в теории, по крайне мере в основном 

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

Цитата(sergioK1 @  6.8.2013,  23:38 Найти цитируемый пост)
В  java проверил final эффект нулевой  

Я не говорил, что это проявится на любой java программе. Я говорил, что такие программы существуют.

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

Да вобщем то про недостатки всех функций  быть виртуальными ,по принципу а может пригодиться ,Я давно понял , надо было раньше об этом произнести  в слух smile 

Про final Я слышал пару раз в реальности ни разу не видел. 


И еше у меня сложилось ощущение в Java не все функции виртуальны , т,е компайлер "умнее" чем в С++ ,
т,е там где наследника нет нету виртуального механизма , Но поскольку документации по теме мизер, то 
остаеться только догадаваться так это или нет ,




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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(sergioK1 @  7.8.2013,  10:16 Найти цитируемый пост)
И еше у меня сложилось ощущение в Java не все функции виртуальны , т,е компайлер "умнее" чем в С++ ,
т,е там где наследника нет нету виртуального механизма ,

Возможно. Та история, которую я тут упоминал, произошла более 20 лет назад, с тех пор компиляторы сильно поумнели  smile 

Хотя в Java есть 2 вещи, одна из которых сильно мешает а вторая помогает проводить такие оптимизации.

В Java есть динамическая загрузка классов, так что не-виртуальный метод может в run-time привратится в виртуальный, что явно не способствует проведению оптимизации в compile-time  smile 

С другой стороны в Java есть JIT компилятор, так что при таком 'внезапном' изменении статуса виртуальности функции ее можно будет и перекомпилировать.  smile 

Что, увы, автоматически перености большую часть оптимизатора в run-time, что отнюдь не добавляет надежности и устойчивости всей Java системе в целом  smile 

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.1323 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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