?

Log in

No account? Create an account
программистское - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

программистское [май. 16, 2007|01:46 am]
Anatoly Vorobey

Все-таки забавно, насколько использование виртуальных методов убивает скорость. Prefetch queue - наше все.

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

СсылкаОтветить

Comments:
Страница 1 из 2
<<[1] [2] >>
[User Picture]From: iratus
2007-05-16 08:48 am
Пишем на С изначально... ;-)
(Ответить) (Thread)
[User Picture]From: vodianoj
2007-05-16 08:55 am
Можно их сделать инлайн, и тогда побежит ещё быстрее.
Зато если под словом "обрабатывает" предположить, что он на самом деле что-то делает (распространённый случай), а не копирует из одного места в другое или там прибавлят 1, то всё преимущество сведётся на нет.
(Ответить) (Thread)
[User Picture]From: averros
2007-05-16 09:21 am
Мммм... или поменять интерфейс класса на предмет заменить скалярные операции на векторные. Чтобы был один вызов виртуальной функции на весь массив.
(Ответить) (Thread)
(Удалённый комментарий)
[User Picture]From: mstone
2007-05-16 10:02 am
Да, возможность заменить динамический полиморфизм на статический — одна из главных радостей C++.
(Ответить) (Thread)
[User Picture]From: fima
2007-05-16 10:10 am
Верится с трудом
(Ответить) (Thread)
[User Picture]From: kika
2007-05-16 05:19 pm
+1
(Ответить) (Parent) (Thread)
[User Picture]From: alex_vinokur
2007-05-16 10:10 am

Comparative performance : virtual vs. ordinary methods

(Ответить) (Thread)
From: 9000
2007-05-16 10:24 am
Интересно, не выиграет ли в этом месте VM с JIT, которая нужны методы не только скомпилирует, но, при небольшом размере, и за-inline-ит независимо от виртуальности.

Можно смотреть на это, кстати, не как на дефект языков с virtual dispatch, а как на дефект процессорной архитектуры, которая к нему не приспособлена. Поди, лет 40 назад в наборах команд процессоров команды для поддержки подпрограмм тоже были экзотикой, не говоря уж о поддержке многопроцессности и многопроцессорности. Ничего, появились. Или там векторные операции -- появились в "мэйнстриме" на наших глазах :)
(Ответить) (Thread)
[User Picture]From: cmm
2007-05-16 10:34 am
> Можно смотреть на это, кстати, не как на дефект языков с virtual dispatch, а как на дефект процессорной архитектуры, которая к нему не приспособлена.

это дефект языков (а точнее, реализаций — не-табличный кеширующий диспатч можно и для C++ сделать, в принципе), жёстко соптимизированных не там где надо.
(Ответить) (Parent) (Thread) (Развернуть)
From: arnold3
2007-05-16 12:56 pm
Покажите листинг.
(Ответить) (Thread)
[User Picture]From: gdy
2007-05-16 04:11 pm
Ещё забавнее будет, если попробуете убрать вызовы функций из тела цикла ;-)
(Ответить) (Thread)
[User Picture]From: juan_gandhi
2007-05-16 04:13 pm
Да-да. Когда я был студентом, нас учили, что нужно поменьше фунцкий и вызовов писать в программах, потому что это неэффективно.
(Ответить) (Parent) (Thread)
[User Picture]From: s1m
2007-05-16 07:11 pm
все CPU ждут память с одинаковой скоростью.

по крайней мере с индиректами/непредсказанными переходами можно достаточно легко бороться (не использовать без необходимости), а вот cache incoherency может угробить производительность многопоточного приложения гораздо сильнее и бороться с этим гораздо сложнее :/
(Ответить) (Thread)
[User Picture]From: 109
2007-05-16 08:20 pm
ухх! а кстати, в джаве появился способ сделать метод невиртуальным, или так все виртуальные и есть всегда?
(Ответить) (Thread)
[User Picture]From: cmm
2007-05-16 08:31 pm
можно final написать, кажися.
(Ответить) (Parent) (Thread)
From: (Anonymous)
2007-05-16 08:56 pm

Правда-правда ;);)

Чистая правда, но вот мы однажды выполнили почти обратное преобразование - изменили условия-с-вызовом-статических-методов на вызов-виртуального-метода в паре циклов, где обрабатывались большие массивы, а все остальное оставили как было. В результате почему-то получили десятикратное ускорение работы. ;););)

было:
if (obje->type == TYPE_01) ((TYPE01)obje)->CallMethod01();
else if (obje->type == TYPE_02) ((TYPE02)obje)->CallMethod01();
else if (obje->type == TYPE_03) ((TYPE03)obje)->CallMethod01();

стало:
obje->CallMethod();
(Ответить) (Thread)
[User Picture]From: yanis
2007-05-17 04:36 am
скорость убивает хуевый дизайн
(Ответить) (Thread)
Страница 1 из 2
<<[1] [2] >>