Чего мне не хватает в FreePascal

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Re: Чего мне не хватает в FreePascal

Сообщение devels » 11.04.2011 20:50:54

Sergei I. Gorelkin писал(а):Если SAVE_INTS - массив shortstring (а string[4] - это shortstring), то в они в цикле преобразуются в ansistring, причем два раза - один при добавлении, другой при чтении...
Но вообще 3.5 секунды на, грубо говоря, цикл из 2000 итераций - это какая-то совсем уж хрень. Тут нужно разбираться.

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


Поставил IntToStr, скорость такая же, ну короче - это мили-мили, я делал тесты shortstring -> string у меня на скорость влиял, за счет кеширования я увеличивал в fpc скорость выполнения этой функции в 3 раза, там тоже массив из shortstring.

Но я кстати скажу, в делфи тоже будет не быстрее чем в пхп. Так что здесь не только в менеджере памяти дело, возможно надо как-то улучшать реализацию хеш-таблицы. У меня получалось увеличить скорость, она приближалась к php, но если отбросить интерпретацию все равно отставала по скорости.


И там не 2000 итераций, а 2000 * 1000 это 2 млн.

Ради прикола протестил тот код у себя в скрипт-движке, даже у меня он выполняется за 3700 mlsec, и это же жесть, практически такая же скорость как у fpc, только у меня своя хеш-таблица, расходы на интерпритацию примерно 1000 млсек, в итогде примерно на таблицу тратится 2700 mlsec.
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: Чего мне не хватает в FreePascal

Сообщение Sergei I. Gorelkin » 11.04.2011 21:26:01

А ось какая, винда или линукс?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Чего мне не хватает в FreePascal

Сообщение Шурик Сетевой » 11.04.2011 21:48:44

А с заменой хеш-функции не проверяли?
Все-таки, вычисление хеша по ключу довольно затратно. И менеджер памяти задействован в слишком многих местах, чтоб уж откровенно тормозить.
Шурик Сетевой
новенький
 
Сообщения: 11
Зарегистрирован: 05.03.2009 21:42:42

Re: Чего мне не хватает в FreePascal

Сообщение devels » 11.04.2011 22:12:58

Операционка Win XP 32.

Хеш функция у меня самая простая и максимально быстрая, быстрее сделать нереально:
По-моему в FPC тоже простая функция.

Код: Выделить всё
function HashTable_Func(const key: AnsiString): Cardinal;
const Seed = 31; (* 31 131 1313 13131 131313 etc... *)
var
  i,len: Cardinal;
begin
  Result := 0;
  len := Length(Key);
  for i := 1 to Len do
    Result := (Result * Seed) + Byte(Key[i]);

  Result := Result and $7FFFFFFF;
end;
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: Чего мне не хватает в FreePascal

Сообщение Sergei I. Gorelkin » 12.04.2011 01:26:42

Да, действительно windows. Что-то я совсем нюх потерял, "uses windows" в упор не вижу :)

Вот примерный расклад для данного теста (в linux, но сути это не меняет):

Код: Выделить всё
   55,139,126  *  /project1.pp:main
        1,412  >   fpc_dynarray_setlength (1x)
           12  >   fpc_setjmp (1x)
           21  >   fpc_popaddrstack (1x)
  383,677,293  >   fpc_shortstr_to_ansistr (2004002x)
  480,802,322  >   CONTNRS_TFPSTRINGHASHTABLE_$__GETDATA$ANSISTRING$$ANSISTRING (1002001x)
  205,321,116  >   fpc_shortstr_concat (2004002x)
           30  >   fpc_pushexceptaddr (1x)
   10,542,169  >   CONTNRS_TFPCUSTOMHASHTABLE_$__CREATE$$TFPCUSTOMHASHTABLE (1x)
       52,365  >   SYSTEM_DO_EXIT (1x)
  220,730,378  >   fpc_ansistr_decr_ref (4009007x)
      527,825  >   SYSUTILS_INTTOSTR$LONGINT$$ANSISTRING (1001x)
       97,212  >   fpc_initializeunits (1x)
       59,515  >   fpc_ansistr_to_shortstr (1001x)
24,406,199,607  >   CONTNRS_TFPCUSTOMHASHTABLE_$__CLEAR (1001x)
  989,597,535  >   CONTNRS_TFPSTRINGHASHTABLE_$__ADD$ANSISTRING$ANSISTRING (1002001x)
   16,032,016  >   fpc_ansistr_incr_ref (1002001x)


Грабли оказываются вовсе не там, где их ждали...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Чего мне не хватает в FreePascal

Сообщение bw » 12.04.2011 07:58:16

Sergei I. Gorelkin писал(а):Вот примерный расклад для данного теста...

А как мне такую же картинку сделать?

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Re: Чего мне не хватает в FreePascal

Сообщение devels » 12.04.2011 08:31:55

Sergei I. Gorelkin писал(а):Да, действительно windows. Что-то я совсем нюх потерял, "uses windows" в упор не вижу :)

Вот примерный расклад для данного теста (в linux, но сути это не меняет):

Код: Выделить всё
24,406,199,607  >   CONTNRS_TFPCUSTOMHASHTABLE_$__CLEAR (1001x)
  989,597,535  >   CONTNRS_TFPSTRINGHASHTABLE_$__ADD$ANSISTRING$ANSISTRING (1002001x)


Грабли оказываются вовсе не там, где их ждали...


Я так понимаю Clear тормознутый?
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: Чего мне не хватает в FreePascal

Сообщение vada » 12.04.2011 10:04:51

Посмотрел на реализацию TFPStringHashTable...
Тупо в лоб без изысков. Более медленный HashTable вариант создать непросто.
Найду время, перепишу. Вернее, с JAVA срисую.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Чего мне не хватает в FreePascal

Сообщение devels » 12.04.2011 10:33:05

Вот реализация побыстрее:

http://code.google.com/p/dwscript/sourc ... tables.pas

Только хеш-функция там слишком сложная, и элементы хеш-таблицы я бы сделал рекордами, а не объектами, и всякие методы Equals заменил бы на че нить побыстрее, а то из-за универсальности это сказывается на скорости выполнения.
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: Чего мне не хватает в FreePascal

Сообщение Sergei I. Gorelkin » 12.04.2011 10:44:03

bw писал(а):А как мне такую же картинку сделать?

Это valgrind. Установив его в линуксе, компилируем программу с -gl (чтобы видеть номера строк), потом

Код: Выделить всё
valgrind --tool=callgrind <имя программы>
(оно печатает всякую хрень, но каждая строка начинается с цифры. Цифру запоминаем)
callgrind_annotate --tree=calling callgrind.out.<цифра>

Еще можно установить разную гуйню вроде alleyoop, и любоваться на окошки.

devels писал(а):Я так понимаю Clear тормознутый?

Он самый.

vada писал(а):Посмотрел на реализацию TFPStringHashTable...Тупо в лоб без изысков. Более медленный HashTable вариант создать непросто.Найду время, перепишу. Вернее, с JAVA срисую.


В том же модуле contnrs есть класс TFPHashList, копия которого используется в самом компиляторе и в каких-то тормозах не замечена. Единственное, у него ключи типа shortstring, а не ansistring. Возможно, позаимствовать нужные решения из него окажется проще.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Чего мне не хватает в FreePascal

Сообщение devels » 12.04.2011 11:31:23

Sergei I. Gorelkin писал(а):
bw писал(а):В том же модуле contnrs есть класс TFPHashList, копия которого используется в самом компиляторе и в каких-то тормозах не замечена. Единственное, у него ключи типа shortstring, а не ansistring. Возможно, позаимствовать нужные решения из него окажется проще.


Ну блин 256 символов часто мало, например путь к программе может быть куда больше. Но протестил класс TFPHashList, он отрабатывается за 300 млсек, это получается в 10 раз быстрее, а то и более...

Дело в том, что для цепочки в TFPDataHashList и подобные - используется не связанный список, а тупо TObjectList (т.е. блин лишние расходы на создание целого ненужного объекта), когда можно хранить цепочку, в виде связанных рекордов, и вдобавок в одну лишь сторону.

Код: Выделить всё
type
   PTableItem = ^TTableItem;
   TTableItem = record
       key: AnsiString; 
       hashCode: LongWord;
       next: PHashItem;


Короче, надо переписывать TFPHashTable для AnsiString ключей, там вроде достаточно добавить параметр длина-ключа и немного магии, чтобы переделать класс. Вот там как раз и на цепочках сделано.
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: Чего мне не хватает в FreePascal

Сообщение vada » 12.04.2011 13:53:16

Sergei I. Gorelkin писал(а):
vada писал(а):Посмотрел на реализацию TFPStringHashTable...Тупо в лоб без изысков. Более медленный HashTable вариант создать непросто.Найду время, перепишу. Вернее, с JAVA срисую.


В том же модуле contnrs есть класс TFPHashList, копия которого используется в самом компиляторе и в каких-то тормозах не замечена. Единственное, у него ключи типа shortstring, а не ansistring. Возможно, позаимствовать нужные решения из него окажется проще.


В JAVA реализовано все гараздо вкуснее. Там каждый объект имеет свой Hash код (Integer). Напримар, если сравниваются две строки на равенство, на самом деле, сравниваются их Hash-и. Поэтому быстро.
Вопервых, сравнение двух Integer гораздо быстрее чем двух String.
Вовторых, в HashTable ключи собираются в двоичное дерево. Поиск по дереву побыстрее прямого перебора в разы.

ЗЫ. Это на пальцах. На самом деле HashTable в JAVA посложнее будет. Это чума как он быстро работает!!!
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Чего мне не хватает в FreePascal

Сообщение perlpunk » 12.04.2011 14:22:37

http://www.freepascal.org/docs-html/fcl ... glist.html
THashedStringList - А что скажете про эту реализацию?

Если в java такой крутой функционал HashTables почему бы не своровать оттуда исходники и реализовать на их основе в fpc?
perlpunk
новенький
 
Сообщения: 90
Зарегистрирован: 26.09.2008 21:19:48

Re: Чего мне не хватает в FreePascal

Сообщение devels » 12.04.2011 15:13:00

vada писал(а):
Sergei I. Gorelkin писал(а):
vada писал(а):Посмотрел на реализацию TFPStringHashTable...Тупо в лоб без изысков. Более медленный HashTable вариант создать непросто.Найду время, перепишу. Вернее, с JAVA срисую.


В том же модуле contnrs есть класс TFPHashList, копия которого используется в самом компиляторе и в каких-то тормозах не замечена. Единственное, у него ключи типа shortstring, а не ansistring. Возможно, позаимствовать нужные решения из него окажется проще.


В JAVA реализовано все гараздо вкуснее. Там каждый объект имеет свой Hash код (Integer). Напримар, если сравниваются две строки на равенство, на самом деле, сравниваются их Hash-и. Поэтому быстро.
Вопервых, сравнение двух Integer гораздо быстрее чем двух String.
Вовторых, в HashTable ключи собираются в двоичное дерево. Поиск по дереву побыстрее прямого перебора в разы.

ЗЫ. Это на пальцах. На самом деле HashTable в JAVA посложнее будет. Это чума как он быстро работает!!!


А что ты думаешь, в какой-то хеш-таблице сравниваются строки? Они там сравниваются один раз в конце, чтобы избежать коллизий, а так сравниваются не строки а их хеш-коды. И кстати там есть параметр - наполненность, цепочки не такие длинные, чтобы для них создавать дерево для поиска, в них то максимум элементов 20-30 по самим пессимистическим расчетам.
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Re: Чего мне не хватает в FreePascal

Сообщение vada » 12.04.2011 15:55:21

Там сравнивается не только строка, но хэш, длинна строки, последний символ строки. Чего бы еще сравнить?..Мммм... Можно контрольную сумму еще посчитать. Упущение :)
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Пред.След.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru