программистское
May. 16th, 2007 01:46 amВсе-таки забавно, насколько использование виртуальных методов убивает скорость. Prefetch queue - наше все.
Скажем, алгоритм обрабатывает большие массивы памяти в цикле, который делает относительно мало работы, а вызывается очень много раз. Итератор цикла - виртуальный метод вспомогательного класса, который вызывает еще пару виртуальных методов, и все они делают очень мало работы. Ничего остального не меняя, делаем эти методы невиртуальными, и алгоритм бежит в пять раз быстрее.
no subject
Date: 2007-05-16 08:48 am (UTC)no subject
Date: 2007-05-16 08:55 am (UTC)Зато если под словом "обрабатывает" предположить, что он на самом деле что-то делает (распространённый случай), а не копирует из одного места в другое или там прибавлят 1, то всё преимущество сведётся на нет.
no subject
Date: 2007-05-16 09:21 am (UTC)no subject
Date: 2007-05-16 09:58 am (UTC)no subject
Date: 2007-05-16 10:02 am (UTC)no subject
Date: 2007-05-16 10:10 am (UTC)Comparative performance : virtual vs. ordinary methods
Date: 2007-05-16 10:10 am (UTC)no subject
Date: 2007-05-16 10:24 am (UTC)Можно смотреть на это, кстати, не как на дефект языков с virtual dispatch, а как на дефект процессорной архитектуры, которая к нему не приспособлена. Поди, лет 40 назад в наборах команд процессоров команды для поддержки подпрограмм тоже были экзотикой, не говоря уж о поддержке многопроцессности и многопроцессорности. Ничего, появились. Или там векторные операции -- появились в "мэйнстриме" на наших глазах :)
no subject
Date: 2007-05-16 10:34 am (UTC)это дефект языков (а точнее, реализаций — не-табличный кеширующий диспатч можно и для C++ сделать, в принципе), жёстко соптимизированных не там где надо.
no subject
Date: 2007-05-16 10:36 am (UTC)В общем, с обеих сторон надо делать какие-то шаги.
Есть же, скажем, процессоры со стековой архитектурой -- кой для чего просто подарочные :)
no subject
Date: 2007-05-16 10:53 am (UTC)no subject
Date: 2007-05-16 11:17 am (UTC)Смешнее то, что JVM стековая, и машина CLR, кажется, тоже стековая.
no subject
Date: 2007-05-16 12:12 pm (UTC)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
Date: 2007-05-16 12:56 pm (UTC)no subject
Date: 2007-05-16 01:15 pm (UTC)the key word here (which you conspiciously omit) is "when".
no subject
Date: 2007-05-16 02:08 pm (UTC)Еще часто помогает curiously recurring template pattern.
no subject
Date: 2007-05-16 02:33 pm (UTC)no subject
Date: 2007-05-16 02:36 pm (UTC)this claim is nonsense. if it wasn't, late binding would never, ever, incur any overhead!
no subject
Date: 2007-05-16 04:11 pm (UTC)no subject
Date: 2007-05-16 04:11 pm (UTC)Главное дело,Кстати, теоретически-то ведь можно на уровне компилятора решить этот вопрос. Не диспатчить миллион раз, а разобраться один раз.
no subject
Date: 2007-05-16 04:13 pm (UTC)no subject
Date: 2007-05-16 04:13 pm (UTC)no subject
Date: 2007-05-16 04:14 pm (UTC)no subject
Date: 2007-05-16 04:41 pm (UTC)To elaborate a bit on my original statement, JVM can only translate a virtual function call to a direct/inline call iff it can infer from the code that dynamic type and static type at the call site are always the same. It cannot assume that just because previous 100 calls were to implementation "a()", the next call will also be to "a()". As a result, what JVM can do at runtime, a C++ compiler can do at compile time. Here is an example:
struct b { virtual void f () = 0; }; struct d1: b { virtual void f () {...} }; struct d2: b { virtual void f () {...} }; int main () { typedef vector<b*> bv; bv v; v.push_back (new d1); v.push_back (new d2); d1 d; for (bv::iterator i (v.begin ()); i != v.end (); ++i) { i->f (); // Neither JVM nor C++ can optimize something like this. d.f (); // Both JVM and C++ can optimize something like this. } }no subject
Date: 2007-05-16 04:41 pm (UTC)а такое, как известно, бывает только в интерпретируемых языках. а интерпретация — это, сами понимаете, Ужастно Медленно!