Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Простая реализация RTTI (run time type information) (комментарии) (3 стр)

Простая реализация RTTI (run time type information) (комментарии) (3 стр)

Страницы: 1 2 3 4 Следующая »
Sergey MakeevПостоялецwww15 янв. 201016:18#30
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;
}
Sergey MakeevПостоялецwww16 янв. 201020:02#31
http://sergeymakeev.com/files/public/reflectionLibrary_v2.zip - вот новая версия, быстрее чем прежняя
обгоняет стандартный dynamicCast на всех процессорах, было бы отлично если кто-нибудь  протестирует на скорость и запостит результаты.


Описание, что нового во 2-й версии
http://sergeymakeev.com/?p=388

MATovУчастникwww16 янв. 201022:40#32
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

stasiПостоялецwww16 янв. 201023:23#33
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Участникwww17 янв. 20100:07#34
хнык) а почему у меня прироста нет, а только убыток, причем жесткий?
Sergey MakeevПостоялецwww17 янв. 20100:36#35
MATov
Да, странно. Раньше strcmp тормозил на интелах, теперь вот на i7 тормоза где то.
Кто нибудь еще на i7 может потестить?
Sergey MakeevПостоялецwww17 янв. 20102:41#36
stasi
> ( могу еще на 3Мгц запустить, если нужно )

Да, запусти - статистика лишней не бывает :)

Sergey MakeevПостоялецwww17 янв. 201016:13#37
Zeux посоветовал оставить сравнение строк только в билдах для разрабов :) Т.к. сравниваемые сроки константны и для них можно сделать идеальный хеш, тем же gperf.
А в билде разрабов поставить assert, так и сделал получил > 120 миллионов кастов (x12 прирост от dynamic_cast) для своем слабеньком AMD

http://sergeymakeev.com/files/public/reflectionLibrary_v3.zip  кто протестирует, тот молодец :)
заодно и для i7 интересны цифры, я только завтра смогу на i7 и X360 потестить и цифры померять

ZeuxПостоялецwww17 янв. 201018:26#38
Перепостил сюда из блога:

Набросал код который из дерева 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

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

Sergey MakeevПостоялецwww17 янв. 201019:27#39
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
у всех пересечений разная длина

сейчас буду новый хеш приделывать к рефлектору :)

ZeuxПостоялецwww17 янв. 201019:56#40
Мой код длину не проверяет, тут (в Source) на самом деле есть с одинаковой длиной и в CRC и в hash. Впрочем в любом случае на target наборе строк (который существенно меньше чем все идентификатороподобные строки) конфликтов наверное все равно нет :)

У нас на crc32 свой rtti для сериализации работает, он честно строит табличку всех типов, и при регистрации типа в табличке проверяет, что crc уникальный.

P.S. hack и junk это неплохая конфликтная пара :)

Sergey MakeevПостоялецwww17 янв. 201020:07#41
Zeux
> Впрочем в любом случае на target наборе строк (который существенно меньше чем
> все идентификатороподобные строки) конфликтов наверное все равно нет :)

При коллизии и соответственно срабатывании ассерта можно и буковку в класс добавить :) Если это очень редко будет, думаю никого не покоробит в команде.

Sergey MakeevПостоялецwww18 янв. 201019:30#42
Сделал еще версию (с нормальной хеш функцией, поправил баги по мелочи, пример с 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

PushkoffУдалёнwww19 янв. 201020:43#43
Sergey Makeev
Я сейчас не вижу кода подсказки, но помоему, та версия которую я видел не поддерживает классы с одним именем но в разных неймспейсах...
infouser8Пользовательwww12 мар. 20100:43#44
Очень интересно эту либу к luabind прикрутить. Там откровенно используется dynamic_cast.
Страницы: 1 2 3 4 Следующая »

/ Форум / Программирование игр / Общее

Тема в архиве.

2001—2018 © GameDev.ru — Разработка игр