opengl_extensions
На интелах все тоже оказывается быстро :) нужно убрать strcmp стандартный, зря я его туда вставил - лень все виновата.
Теперь прирост есть всегда на любом проце.
RS_INLINE bool operator == (const reflection::staticString & s1, const reflection::staticString & s2)
{
int size1 = s1.size();
int size2 = s2.size();
if ( (size1 == size2) &&
(s1.hash() == s2.hash()))
{
const char * __restrict str1 = s1.c_str();
const char * __restrict str2 = s2.c_str();
for (int n = 0; n < size2; n++, str1++, str2++)
{
if (*str1 != *str2)
{
return false;
}
}
return true;
}
return false;
}http://sergeymakeev.com/files/public/reflectionLibrary_v2.zip - вот новая версия, быстрее чем прежняя
обгоняет стандартный dynamicCast на всех процессорах, было бы отлично если кто-нибудь протестирует на скорость и запостит результаты.
Описание, что нового во 2-й версии
http://sergeymakeev.com/?p=388
Sergey Makeev
dynamic_cast 27.20M casts per second (r:005512C8)
reflection::cast 6.27M casts per second (r:005512C8)
reflection::cast faster that dynamic_cast x0.23
Железо:
Intel Core i7 2.8Мгц
GeForce GTS 250
4Гб памяти
Win7 x64
Sergey Makeev
dynamic_cast 23.27M casts per second (r:00342610)
reflection::cast 89.29M casts per second (r:00342610)
reflection::cast faster that dynamic_cast x3.84
кор 2 квад 2.4( могу еще на 3Мгц запустить, если нужно )
собрал с icc
dynamic_cast 22.20M casts per second (r:00342910)
reflection::cast 91.46M casts per second (r:00342910)
reflection::cast faster that dynamic_cast x4.12
хнык) а почему у меня прироста нет, а только убыток, причем жесткий?
MATov
Да, странно. Раньше strcmp тормозил на интелах, теперь вот на i7 тормоза где то.
Кто нибудь еще на i7 может потестить?
stasi
> ( могу еще на 3Мгц запустить, если нужно )
Да, запусти - статистика лишней не бывает :)
Zeux посоветовал оставить сравнение строк только в билдах для разрабов :) Т.к. сравниваемые сроки константны и для них можно сделать идеальный хеш, тем же gperf.
А в билде разрабов поставить assert, так и сделал получил > 120 миллионов кастов (x12 прирост от dynamic_cast) для своем слабеньком AMD
http://sergeymakeev.com/files/public/reflectionLibrary_v3.zip кто протестирует, тот молодец :)
заодно и для i7 интересны цифры, я только завтра смогу на i7 и X360 потестить и цифры померять
Перепостил сюда из блога:
Набросал код который из дерева 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
Отсюда мораль:
а. твоя хеш функция не очень хорошая :)
б. менять хеш скорее всего не придется! оба конфликта отличаются длиной строки.
Zeux
Чорт :) я в рефелектор тупо взял нашу хеш функцию из движка Блада - она вроде быстрая была и с нормальным распределением. Похоже, что сильно ошибался.
Проверил на нашей кодебазе 1460 файлов, 9 мегабайт
моя хеш функция
http://www.everfall.com/paste/id.php?7cwqv3rv26w6
новая хеш функция из STL взял:
uint32 hash(const char * buffer)
{
uint32 val = 2166136261U;
char sym = *buffer;
while(sym)
{
val = 16777619U * val ^ sym;
buffer++;
sym = *buffer;
}
return val;
}Пересечений нет вообще
Проверил на source двиге : 9814 файлов, 123Мб
http://www.everfall.com/paste/id.php?lufu62en3z6f
у всех пересечений разная длина
сейчас буду новый хеш приделывать к рефлектору :)
Мой код длину не проверяет, тут (в Source) на самом деле есть с одинаковой длиной и в CRC и в hash. Впрочем в любом случае на target наборе строк (который существенно меньше чем все идентификатороподобные строки) конфликтов наверное все равно нет :)
У нас на crc32 свой rtti для сериализации работает, он честно строит табличку всех типов, и при регистрации типа в табличке проверяет, что crc уникальный.
P.S. hack и junk это неплохая конфликтная пара :)
Zeux
> Впрочем в любом случае на target наборе строк (который существенно меньше чем
> все идентификатороподобные строки) конфликтов наверное все равно нет :)
При коллизии и соответственно срабатывании ассерта можно и буковку в класс добавить :) Если это очень редко будет, думаю никого не покоробит в команде.
Сделал еще версию (с нормальной хеш функцией, поправил баги по мелочи, пример с DLL сделал - когда часть классов рефлектора в DLL лежит)
скорость каста не зависит от длины имени класса
http://sergeymakeev.com/files/public/reflectionLibrary_v4.rar
Вот результаты замера скорости (все собиралось VS2005 /O2), хуже всего прирост на X360, лучше всего на AMD.
Надо будет посмотреть, почему на боксе такая жопа - где то в память похоже упирается, хотя по идее не должно.
Xenon X360 @ 3.2 Ghz Speed compare: 200000000 dynamic cast ----------------------------------------------- dynamic_cast 9.15M casts per second (r:40001D90) reflection::cast 22.07M casts per second (r:40001D90) reflection::cast faster that dynamic_cast x2.41 i7 920 @ 2.67 Ghz Speed compare: 200000000 dynamic cast ----------------------------------------------- dynamic_cast 27.23M casts per second (r:004E2C68) reflection::cast 200.00M casts per second (r:004E2C68) reflection::cast faster that dynamic_cast x7.34 AMD Athlon 64x2 3800+ @ 2.0 Ghz Speed compare: 200000000 dynamic cast ----------------------------------------------- dynamic_cast 12.17M casts per second (r:00B43F38) reflection::cast 137.27M casts per second (r:00B43F38) reflection::cast faster that dynamic_cast x11.28 Xeon E5310 @ 1.6 Ghz Speed compare: 200000000 dynamic cast ----------------------------------------------- dynamic_cast 15.74M casts per second (r:000215B8) reflection::cast 119.62M casts per second (r:000215B8) reflection::cast faster that dynamic_cast x7.60 Core2Duo E6750 @ 2.66 Ghz Speed compare: 200000000 dynamic cast ----------------------------------------------- dynamic_cast 26.02M casts per second (r:00342C68) reflection::cast 196.85M casts per second (r:00342C68) reflection::cast faster that dynamic_cast x7.57
Sergey Makeev
Я сейчас не вижу кода подсказки, но помоему, та версия которую я видел не поддерживает классы с одним именем но в разных неймспейсах...
Очень интересно эту либу к luabind прикрутить. Там откровенно используется dynamic_cast.
Тема в архиве.