avva: (Default)
[personal profile] avva

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

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

Date: 2007-05-16 08:48 am (UTC)
From: [identity profile] iratus.livejournal.com
Пишем на С изначально... ;-)

Date: 2007-05-16 08:55 am (UTC)
From: [identity profile] vodianoj.livejournal.com
Можно их сделать инлайн, и тогда побежит ещё быстрее.
Зато если под словом "обрабатывает" предположить, что он на самом деле что-то делает (распространённый случай), а не копирует из одного места в другое или там прибавлят 1, то всё преимущество сведётся на нет.

Date: 2007-05-16 09:21 am (UTC)
From: [identity profile] averros.livejournal.com
Мммм... или поменять интерфейс класса на предмет заменить скалярные операции на векторные. Чтобы был один вызов виртуальной функции на весь массив.

Date: 2007-05-16 09:58 am (UTC)
From: [identity profile] whoozle.livejournal.com
по хорошему, таких узких мест не должно быть :-) что-то не так с архитектурой. :-)

Date: 2007-05-16 10:02 am (UTC)
From: [identity profile] mstone.livejournal.com
Да, возможность заменить динамический полиморфизм на статический — одна из главных радостей C++.

Date: 2007-05-16 10:10 am (UTC)
From: [identity profile] fima.livejournal.com
Верится с трудом

Date: 2007-05-16 05:19 pm (UTC)

Date: 2007-05-16 05:56 pm (UTC)
From: [identity profile] avva.livejournal.com
А вот же.

Date: 2007-05-16 07:04 pm (UTC)
From: [identity profile] s1m.livejournal.com
почему? если алгоритм делает мало действий и много вызовов, то непредсказанные переходы оказывают довольно большое влияние.

(no subject)

From: [identity profile] fima.livejournal.com - Date: 2007-05-16 07:15 pm (UTC) - Expand

(no subject)

From: [identity profile] fima.livejournal.com - Date: 2007-05-16 09:40 pm (UTC) - Expand

(no subject)

From: [identity profile] s1m.livejournal.com - Date: 2007-05-16 10:11 pm (UTC) - Expand

(no subject)

From: [identity profile] fima.livejournal.com - Date: 2007-05-17 05:56 am (UTC) - Expand

(no subject)

From: [identity profile] s1m.livejournal.com - Date: 2007-05-17 06:33 pm (UTC) - Expand

Date: 2007-05-17 12:29 pm (UTC)
From: [identity profile] e2pii1.livejournal.com
Неудивительно и совершенно естественно.
Вызов функции - это сохранение/восстановление регистров, параметры в стек, и возможно ломаются оптимизации.

невиртуальные методы компилятор сам превращает в inline
From: [identity profile] alex-vinokur.livejournal.com
http://article.gmane.org/gmane.comp.lang.c++.perfometer/66

Date: 2007-05-16 10:24 am (UTC)
nine_k: A stream of colors expanding from brain (Default)
From: [personal profile] nine_k
Интересно, не выиграет ли в этом месте VM с JIT, которая нужны методы не только скомпилирует, но, при небольшом размере, и за-inline-ит независимо от виртуальности.

Можно смотреть на это, кстати, не как на дефект языков с virtual dispatch, а как на дефект процессорной архитектуры, которая к нему не приспособлена. Поди, лет 40 назад в наборах команд процессоров команды для поддержки подпрограмм тоже были экзотикой, не говоря уж о поддержке многопроцессности и многопроцессорности. Ничего, появились. Или там векторные операции -- появились в "мэйнстриме" на наших глазах :)

Date: 2007-05-16 10:34 am (UTC)
From: [identity profile] cmm.livejournal.com
> Можно смотреть на это, кстати, не как на дефект языков с virtual dispatch, а как на дефект процессорной архитектуры, которая к нему не приспособлена.

это дефект языков (а точнее, реализаций — не-табличный кеширующий диспатч можно и для C++ сделать, в принципе), жёстко соптимизированных не там где надо.

(no subject)

From: [personal profile] nine_k - Date: 2007-05-16 10:36 am (UTC) - Expand

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2007-05-16 10:53 am (UTC) - Expand

(no subject)

From: [personal profile] nine_k - Date: 2007-05-16 11:17 am (UTC) - Expand

(no subject)

From: [identity profile] ivan-gandhi.livejournal.com - Date: 2007-05-16 04:14 pm (UTC) - Expand

(no subject)

From: [identity profile] ivan-gandhi.livejournal.com - Date: 2007-05-16 04:11 pm (UTC) - Expand

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2007-05-16 04:41 pm (UTC) - Expand

Date: 2007-05-16 12:12 pm (UTC)
From: (Anonymous)
> VM с JIT, которая нужны методы не только скомпилирует, но, при небольшом размере, и за-inline-ит независимо от виртуальности

If the dynamic types of object which you are calling do not match the static type (i.e., different virtual functions being called) then I would love to see how JVM will inline this. If it is possible to determine that dynamic and static types are the same then any decent C++ compiler will generate a direct function call and will inline it if the function was defined as inline.

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2007-05-16 01:15 pm (UTC) - Expand

(no subject)

From: (Anonymous) - Date: 2007-05-16 02:33 pm (UTC) - Expand

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2007-05-16 02:36 pm (UTC) - Expand

(no subject)

From: (Anonymous) - Date: 2007-05-16 04:41 pm (UTC) - Expand

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2007-05-16 06:24 pm (UTC) - Expand

(no subject)

From: (Anonymous) - Date: 2007-05-17 10:16 am (UTC) - Expand

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2007-05-17 10:51 am (UTC) - Expand

(no subject)

From: (Anonymous) - Date: 2007-05-17 02:04 pm (UTC) - Expand

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2007-05-17 02:20 pm (UTC) - Expand

(no subject)

From: (Anonymous) - Date: 2007-05-17 02:42 pm (UTC) - Expand

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2007-05-17 02:49 pm (UTC) - Expand

(no subject)

From: [identity profile] cmm.livejournal.com - Date: 2007-05-17 02:41 pm (UTC) - Expand

Date: 2007-05-16 08:23 pm (UTC)
From: [identity profile] 109.livejournal.com
что-то я торможу. а как можно заинлайнить виртуальный метод?

(no subject)

From: (Anonymous) - Date: 2007-05-17 10:09 am (UTC) - Expand

(no subject)

From: [personal profile] nine_k - Date: 2007-05-19 08:56 pm (UTC) - Expand

(no subject)

From: [identity profile] 109.livejournal.com - Date: 2007-05-19 11:11 pm (UTC) - Expand

(no subject)

From: [personal profile] nine_k - Date: 2007-05-19 11:26 pm (UTC) - Expand

(no subject)

From: [identity profile] 109.livejournal.com - Date: 2007-05-20 09:22 am (UTC) - Expand

(no subject)

From: [personal profile] nine_k - Date: 2007-05-20 06:44 pm (UTC) - Expand

(no subject)

From: [identity profile] 109.livejournal.com - Date: 2007-05-21 04:55 am (UTC) - Expand

(no subject)

From: [personal profile] nine_k - Date: 2007-05-24 12:46 pm (UTC) - Expand

Date: 2007-05-16 12:56 pm (UTC)
From: [identity profile] arnold3.livejournal.com
Покажите листинг.

Date: 2007-05-16 04:11 pm (UTC)
From: [identity profile] gdy.livejournal.com
Ещё забавнее будет, если попробуете убрать вызовы функций из тела цикла ;-)

Date: 2007-05-16 04:13 pm (UTC)
From: [identity profile] ivan-gandhi.livejournal.com
Да-да. Когда я был студентом, нас учили, что нужно поменьше фунцкий и вызовов писать в программах, потому что это неэффективно.

Date: 2007-05-16 04:13 pm (UTC)
From: [identity profile] avva.livejournal.com
В данном случае это непрактично.

(no subject)

From: [identity profile] gdy.livejournal.com - Date: 2007-05-17 06:48 am (UTC) - Expand

Date: 2007-05-16 07:11 pm (UTC)
From: [identity profile] s1m.livejournal.com
все CPU ждут память с одинаковой скоростью.

по крайней мере с индиректами/непредсказанными переходами можно достаточно легко бороться (не использовать без необходимости), а вот cache incoherency может угробить производительность многопоточного приложения гораздо сильнее и бороться с этим гораздо сложнее :/

Date: 2007-05-16 08:20 pm (UTC)
From: [identity profile] 109.livejournal.com
ухх! а кстати, в джаве появился способ сделать метод невиртуальным, или так все виртуальные и есть всегда?

Date: 2007-05-16 08:31 pm (UTC)
From: [identity profile] cmm.livejournal.com
можно final написать, кажися.

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

Date: 2007-05-16 08:56 pm (UTC)
From: (Anonymous)
Чистая правда, но вот мы однажды выполнили почти обратное преобразование - изменили условия-с-вызовом-статических-методов на вызов-виртуального-метода в паре циклов, где обрабатывались большие массивы, а все остальное оставили как было. В результате почему-то получили десятикратное ускорение работы. ;););)

было:
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();

Date: 2007-05-17 04:36 am (UTC)
From: [identity profile] yanis.livejournal.com
скорость убивает хуевый дизайн

Date: 2007-05-17 08:40 am (UTC)
From: [identity profile] qaraabayna.livejournal.com
You just posted your best post so far.

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 10:11 am
Powered by Dreamwidth Studios