C++ reflection - возвращение

Как заметили на форуме gamedev.ru, прошлая версия DynamicCast проигрывала стандартной версии при использовании на Intel процессорах, с длинными именами классов (>20 символов) , на AMD же все по прежнему было хорошо, это меня удивило и я стал разбираться.

Профайлер подсказал, что все дело в использовании стандартного strcmp. После использования самописного аналога - Intel и AMD снова работают как и ожидалось. Как приятный бонус скорость DynamicCast подросла почти на 50% и на моем AMD 3000+ в 4.5 раза быстрее чем стандартный cast.

Так же в качестве бонуса, по подсказке my.name,  сделал автоматическое определение базового класса (без указания его в макросе объявляющим метаданные) и перенес определение рефлекшн аттрибутов в хидер.

В общем вот: новая версия reflectionLibrary_v2

5 Comments

Arseny KapoulkineJanuary 17th, 2010 at 4:25

Как по мне, дурная затея - strcmp делать, если уж экстремальной скорости хочется.
Я вижу два варианта.
Простой - if (size == other.size && hash == other.hash) { assert(strcmp(str, other.str) == 0); return true; }.
Для параноиков - т.к. все строчки, которые могут сравниваться, известны, то нужно их интернить где-нибудь на статической инициализации (заодно и хеш посчитаешь в рантайме, без всяких извратов), а потом сравнивать указатели. Но вообще все это никому не надо, if + assert достаточно.

JokerJanuary 17th, 2010 at 17:37

Да, я как то на автомате воткнул strcmp :) зря конечно, просто протупил.

Надо с ассертом попробовать, на боевом наборе имен классов - может и не будет коллизий.

JokerJanuary 17th, 2010 at 19:16

http://sergeymakeev.com/files/public/reflectionLibrary_v3.zip сделал с ассертом :) в расчете на идеальный хеш, получил >x12 прирост.

вот, что значит взгляд со стороны :) спасибо за совет

Arseny KapoulkineJanuary 17th, 2010 at 21:13

Набросал код который из дерева C/C++ исходников выдирает то что похоже на идентификаторы ([A-Za-z0-9_]+), считает хеш твоей функцией, считает CRC ну и ищет конфликты (без учета длины). Посмотрел на нашей кодобазе (4163 файла, 31 мегабайт)

Исходник: http://www.everfall.com/paste/id.php?g6b1bxhz8hz3
Результаты с твоей хеш функцией: http://www.everfall.com/paste/id.php?cx80dli8oc8i
Результаты с микрософтовской хеш функцией (из STL): http://www.everfall.com/paste/id.php?4p65gdejtn50

Отсюда мораль:
а. твоя хеш функция не очень хорошая :)
б. менять хеш скорее всего не придется! оба конфликта отличаются длиной строки :)

AndreyJanuary 18th, 2010 at 11:48

dynamic_cast 21.37M casts per second (r:00334B18)
reflection::cast 75.00M casts per second (r:00334B18)

reflection::cast faster that dynamic_cast x3.51

Intel Core 2 Duo 3.40 Гц.

Leave a comment

Your comment