powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TDictionary или TList<>.BinarySearch с позиции поиска
479 сообщений из 479, показаны все 20 страниц
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366116
серчер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Миллион сортированных строк (MSSQL ORDER BY ASC):
str: varchar(12), value: int

Str - фиксированной длины, то есть все строки всегда одной длинны и содержат только цифры.

В режиме многопоточности сканится список и иногда обновляется (путем добавления снизу).

Что хотелось бы - скорости в поиске и отсутствия большого объема данных в памяти.

В настоящий момент я использую TList<>.BinarySearch.
Comparer конкретно в данном случае выглядит примерно так:
Код: pascal
1.
  Result := CompareStr(L.Str, R.Str);



Но есть другие места, где в схожей задаче comparer выглядит так
Код: pascal
1.
2.
3.
4.
5.
  Result := CompareStr(L.Str, R.Str);
  if Result = 0
    Result := CompareStr(L.Secondary, R.Secondary);
  if Result = 0
    REsult := ValueSign(L.Code, R.Code);



Вторичный вопрос:
Имеет ли особый смысл приведения строковых данных, например, к а) хешу и б) инту (интам), кодируя каждый байт строки?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366129
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант - разбей гигантский лист на несколько поменьше.
И данные в них раздели например по MOD от хэша.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366164
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчер,

Хеш быстрее сортированного списка или тем более дерева
В чём вопрос - я так и не понял
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366170
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчер,

может базе отдать базово и не заниматься творческим онанизмом?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366187
серчер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU ,

хеш - это же строка в любом случае, нет?
12 символов против 20, а в чем тогда выгода?

Это выше вопросы - раз. и два - стоит ли вместо строк хранить хеш в листе и все это делать самому, или, например, воспользвоаться TDictionary - он же сам это все (в тч бинарный поиск) делает или нет?


makhaonможет базе отдать базово
Ну давайте рассуждать
а) много потоков
б) в пике до 50 серчей в секунду.
в) миллион записей (это порядок цифр, а не точное значение).

Что лучше - затрахать базу по ТСР или использовать память и проц сервера?
Допустим выбираем "затрахать базу по ТСР". Что сделать? Все строки привести к чему? Или построить индекс по тексту?

rgreat , это уже перебор. Не понятно, что это даст.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366188
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
серчер SOFT FOR YOU ,

хеш - это же строка в любом случае, нет?
нет
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366194
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчер,

ой, да ладно, напугал базу миллионом записей )

>в пике до 50 серчей в секунду.

гугл посмотри, и ничего - справляется. весь вопрос в базе, железе и запросах. вообще, я для себя давно вывел простое правило. базы не зря придумали. и алгоритмы для них десятилетиями пилили. и довольно мало шансов, что у себя получится сделать лучше.
поэтому всем поиском должна заниматься база. только нужно её нормально настроить и запросы написать.
впрочем - дело твоё, конечно.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366196
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчер rgreat , это уже перебор. Не понятно, что это даст.
Если сделаешь 10 листов вместо одного то искать придется не в миллионе записей а в ста тысячах.
Что явно быстрей.
И это все почти бесплатно.

Опять-таки добавление объекта в маленький сортированый лист будет работать на порядок быстрей чем в большой.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366197
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчер,

авторЧто лучше - затрахать базу по ТСР или использовать память и проц сервера?

к слову - а чё её трахать? если у тебя изменяемых записей почти нет? кидай данные на сторону базы и пусть она там в себе ковыряется сама.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366203
серчер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator, приведите пример класса с хеш-переменной, какой у нее будет тип?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366206
серчер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonсерчер,

ой, да ладно, напугал базу миллионом записей )

>в пике до 50 серчей в секунду.

гугл посмотри, и ничего - справляется. весь вопрос в базе, железе и запросах. вообще, я для себя давно вывел простое правило. базы не зря придумали. и алгоритмы для них десятилетиями пилили. и довольно мало шансов, что у себя получится сделать лучше.
поэтому всем поиском должна заниматься база. только нужно её нормально настроить и запросы написать.
впрочем - дело твоё, конечно.

Там были еще вопросы или мимо прошли вопросы? :) А я бы почитал ответы :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366207
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчерdefecator, приведите пример класса с хеш-переменной, какой у нее будет тип?Тип может быть любой.
От байта до строки.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366209
серчер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, а что вы скажете про TDictionary vs TList<> в плане использования для поиска?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366212
серчер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreatсерчерdefecator, приведите пример класса с хеш-переменной, какой у нее будет тип?Тип может быть любой.
От байта до строки.

Разумеется. Какой в данном случае подойдет?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366214
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчер,

TDictionary по любому быстрей, но могут быть рандомные просадки быстродействия во время его роста.
И на TDictionary надо больше памяти.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366215
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчер,

Вот - такие у меня для тебя ответы :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366216
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчерГоспода, а что вы скажете про TDictionary vs TList<> в плане использования для поиска?

Ищет быстро. Хэши долго делает.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366218
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчер,

Обычно используют 4 байта. А что подойдет вам - это ваше решение.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366237
серчер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon ,
да я так и понял, что никаких, кроме блаблабла :)


asviridenkov , спасибо


rgreat , мой случай это строка из 12 символов. 12 байт.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39366243
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчерГоспода, а что вы скажете про TDictionary vs TList<> в плане использования для поиска?

Скажу - замути тест и сам замерь производительность
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39367281
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчерхеш - это же строка в любом случае, нет?
Нет, конечно. Результат простой хеш-функции CRC32 это integer
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39367904
серчер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonсерчер,

Приходишь на публичный форум - будь готов к любым ответам.

Всё взаимообратно. Отвечаешь что хочешь, ведешь себя непотребно или говоришь не по теме - ты никому нравиться не обязан.

Квейд
В рамках Дельфи?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39367995
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчерВсё взаимообратно. Отвечаешь что хочешь, ведешь себя непотребно или говоришь не по теме - ты никому нравиться не обязан.Вообще-то он всё правильно говорил. Кури матчасть. Хэш может быть какой угодно, чаще всего целочисленное число
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39368514
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну че там по тестам то?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39368879
серчер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU
Пока не делал.
Лучшим решением все таки было бы хеш сделать. Только не очень понятно чем воспользоваться, чтобы к инту привести вот такие строки

D6999900001
D6999900002
A6999900003
F6999900004
....

И затем сравниваемое (которое может входить или не входить в данный набор) так же приводить к уникальному инту и по нему сравнивать.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39368880
серчер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
причем чем-то таким, чтобы это еще в базе можно было бы выгрузить в готовом виде. А не так чтобы в коде еще шерстить. Это вариант, если не получится из базы достать готовый.

Может есть какие то стандартные функции хеширования в инт для дельфи и мсскл?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39368907
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CRC32 же!
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39368926
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В современных делфях хэшей вагон и маленькая тележка. Даже модуль специальный есть. А ТС упорно игнорирует совет почитать матчасть чтоб представлять что это и с чем его едят...
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369072
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, я тут небольшой тест сделал TDictionary<string, object> c Trie.
Содержимое - список тегов HTML, прогоняется много раз поиск всего списка в словаре.
Получается, что на поиске trie дает где-то 40% выигрыша.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369077
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Частный случай всегда быстрей чем универсалка.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369085
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЧастный случай всегда быстрей чем универсалка.

Ага, конечно. Сравни TStringList c TDictionary
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369087
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov,

TStringList не оптимизирован на поиск ключей.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369090
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovКстати, я тут небольшой тест сделал TDictionary<string, object> c Trie.
Содержимое - список тегов HTML, прогоняется много раз поиск всего списка в словаре.
Получается, что на поиске trie дает где-то 40% выигрыша.Пример выложить можешь? Хочу свой словарик сравнить
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369091
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovКстати, я тут небольшой тест сделал TDictionary<string, object> c Trie.
Содержимое - список тегов HTML, прогоняется много раз поиск всего списка в словаре.
Получается, что на поиске trie дает где-то 40% выигрыша.
Просто TDictionary невероятный тормоз. У меня хеш-таблица построенная по аналогичному алгоритму (открытая адресация с линейным пробированием) тоже уделывает TDictionary. На рандомных ключах (GUID) на 97%, на ключах с последовательно изменяющейся частью (index1 .. 1000000) на 159%, на английском словаре на 46%.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369092
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovАга, конечно. Сравни TStringList c TDictionary
На длинных ключах стринглист надерёт словарю жопу ;)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369094
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

он совсем простой

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
procedure TForm23.Button1Click(Sender: TObject);
var i, k, T: integer;
    L: TStringList;
    s: string;
    D: TDictionary<string, TObject>;
    //ST: THtStringTrie;
    O: TObject;
begin
  L:=TStringList.Create;
  L.Add('div');
  L.Add('span');
  L.Add('table');
  L.Add('td');
  L.Add('tr');
  L.Add('th');
  L.Add('li');
  L.Add('meta');
  L.Add('script');
  L.Add('style');
  L.Add('ol');
  L.Add('ul');
  L.Add('h1');
  L.Add('h2');
  L.Add('h3');
  L.Add('h4');
  L.Add('h5');
  L.Add('thead');
  L.Add('tbody');
  L.Add('html');
  L.Add('body');
  L.Add('blockquote');
  L.Add('address');
  L.Add('frame');
  L.Add('frameset');
  L.Add('pre');
  L.Add('button');
  L.Add('textarea');
  L.Add('strike');
  L.Add('del');
  L.Add('menu');
  L.Add('small');
  L.Add('sub');
  L.Add('sup');
  L.Add('img');
  L.Add('fieldset');
  L.Add('legend');
  D := TDictionary<string, TObject>.Create;
  for i := 0 to L.Count - 1 do
    D.Add(L[i], TObject.Create);
  //ST := THtStringTrie.Create();
  //for i := 0 to L.Count - 1 do
  //  ST.Add(L[i], TObject.Create);
  T := GetTickCount;
  for i := 1 to 1000000 do
  begin
    for k := 0 to L.Count -1 do
      D.TryGetValue(L[k], O)
      //ST.Find(L[k], O);
  end;
  Caption := inttostr(GetTickCount - T);
end;
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369095
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyasviridenkovАга, конечно. Сравни TStringList c TDictionary
На длинных ключах стринглист надерёт словарю жопу ;)

На малом числе строк, в принципе тоже должен.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369096
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyasviridenkovКстати, я тут небольшой тест сделал TDictionary<string, object> c Trie.
Содержимое - список тегов HTML, прогоняется много раз поиск всего списка в словаре.
Получается, что на поиске trie дает где-то 40% выигрыша.
Просто TDictionary невероятный тормоз. У меня хеш-таблица построенная по аналогичному алгоритму (открытая адресация с линейным пробированием) тоже уделывает TDictionary. На рандомных ключах (GUID) на 97%, на ключах с последовательно изменяющейся частью (index1 .. 1000000) на 159%, на английском словаре на 46%.

А хэш какой - CRC32? Ты софлкомплетовскую реализацию Hashrie за основу брал?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369098
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovА хэш какой - CRC32? Ты софлкомплетовскую реализацию Hashrie за основу брал?
Хеш Седжвика. За основу брал голый алгоритм таблицы с открытой адресацией, т.к. он самый простой и удовлетворяет некоторым дополнительным условиям.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369100
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На ноуте несколько проходов:
TDictionary ~3678
TdxNamedObjectDictionary ~2266
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369102
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще для таких небольших константных словариков легко идеальный хэш подобрать и сделать специализированный словарь - ещё быстрее будет
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369105
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerНа ноуте несколько проходов:
TDictionary ~3678
TdxNamedObjectDictionary ~2266

Ну вот у меня на простейшем Trie ровно такой же результат.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369108
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovКстати, я тут небольшой тест сделал TDictionary<string, object> c Trie.
Содержимое - список тегов HTML, прогоняется много раз поиск всего списка в словаре.
Получается, что на поиске trie дает где-то 40% выигрыша.

А ты сравни с CachedSerializer
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369109
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчерпричем чем-то таким, чтобы это еще в базе можно было бы выгрузить в готовом виде. А не так чтобы в коде еще шерстить. Это вариант, если не получится из базы достать готовый.

Может есть какие то стандартные функции хеширования в инт для дельфи и мсскл?

Ты меня начинаешь подбешивать
TDictionary, когда ключ строка - уже автоматически все делает
За тебя
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369110
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUasviridenkovКстати, я тут небольшой тест сделал TDictionary<string, object> c Trie.
Содержимое - список тегов HTML, прогоняется много раз поиск всего списка в словаре.
Получается, что на поиске trie дает где-то 40% выигрыша.

А ты сравни с CachedSerializer

Я же тест выложил, запусти и сравни.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369116
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Быстрый хэшик для строки.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
{$OverFlowChecks OFF}
function GetHash(const Key: String): integer;
var
  a : Integer;
  i : Integer;
begin
  Result:=0;
  a:=63689;
  for i:=1 To Length(Key)-1 do begin
    Result:=Result*a+PWordArray(Key)[i];
    a:=a*378551;
  end;
end;
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369117
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Ты всерьез думаешь что это быстрее CRC32?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function CalcStrCRC32(const s: string): cardinal;
var p: pchar;
begin
  Result := $FFFFFFFF;
  p := pointer(s);
  if p <> nil then
    while p^ <> #0 do
    begin
      Result := (((Result shr 8) and $00FFFFFF) xor (Ccitt32Table[(Result xor byte(p^)) and $FF]));
      inc(p);
    end;
end;
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369118
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov,

Проверил, быстрей. А еще говорят дает меньше коллизов.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369120
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatasviridenkov,

Проверил, быстрей. А еще говорят дает меньше коллизов.

Насколько быстрее?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369121
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
procedure TMain.Button3Click(Sender: TObject);
const
  CRC32_POLYNOMIAL = $EDB88320;
var
  i, k, T      : integer;
  L            : TStringList;
  Ccitt32Table : array[0..255] of longint;

  function crc32(crc : longint; const c : byte) : longint;
  begin
    crc32 := (((crc shr 8) and $00FFFFFF) xor (Ccitt32Table[(crc xor c) and $FF]));
  end;

  procedure BuildCRCTable;
  var
  i, j, value : DWORD;
  begin
  for i := 0 to 255 do
  begin
  value := i;
  for j := 8 downto 1 do
  begin
  if ((value and 1) <> 0) then
  value := (value shr 1) xor CRC32_POLYNOMIAL
  else
  value := value shr 1;
  end;
  Ccitt32Table[i] := value;
  end
  end;


function GetHash1(const Key: String): integer;
var p: pchar;
begin
  Result := $FFFFFFFF;
  p := pointer(Key);
  if p <> nil then
    while p^ <> #0 do
    begin
      Result := (((Result shr 8) and $00FFFFFF) xor (Ccitt32Table[(Result xor byte(p^)) and $FF]));
      inc(p);
    end;
end;

{$OverFlowChecks OFF}
function GetHash2(const Key: String): integer;
var
  a : Integer;
  i : Integer;
begin
  Result:=0;
  a:=63689;
  for i:=1 To Length(Key)-1 do begin
    Result:=Result*a+PWordArray(Key)[i];
    a:=a*378551;
  end;
end;
{$OverFlowChecks On}


begin
  BuildCRCTable;

  L:=TStringList.Create;
  L.Add('div');
  L.Add('span');
  L.Add('table');
  L.Add('td');
  L.Add('tr');
  L.Add('th');
  L.Add('li');
  L.Add('meta');
  L.Add('script');
  L.Add('style');
  L.Add('ol');
  L.Add('ul');
  L.Add('h1');
  L.Add('h2');
  L.Add('h3');
  L.Add('h4');
  L.Add('h5');
  L.Add('thead');
  L.Add('tbody');
  L.Add('html');
  L.Add('body');
  L.Add('blockquote');
  L.Add('address');
  L.Add('frame');
  L.Add('frameset');
  L.Add('pre');
  L.Add('button');
  L.Add('textarea');
  L.Add('strike');
  L.Add('del');
  L.Add('menu');
  L.Add('small');
  L.Add('sub');
  L.Add('sup');
  L.Add('img');
  L.Add('fieldset');
  L.Add('legend');

  T := GetTickCount;
  for i := 1 to 1000000 do
  begin
    for k := 0 to L.Count -1 do
      GetHash1(L[k]);
  end;
  Edit1.Text := inttostr(GetTickCount - T);

  T := GetTickCount;
  for i := 1 to 1000000 do
  begin
    for k := 0 to L.Count -1 do
      GetHash2(L[k]);
  end;
  Edit2.Text := inttostr(GetTickCount - T);
end;



953 vs 797
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369122
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А на длинных строках разница может быть и вдвое
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369123
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строки по 255 символов:

2109 vs 1282
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369124
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Случайно на x64 тестил.

Release x86 (Small Strings) 1078 vs 875
Release x86 (256 Strings) 1125 vs 562
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369125
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatСлучайно на x64 тестил.

Release x86 (Small Strings) 1078 vs 875
Release x86 (256 Strings) 1125 vs 562

Ну в общем получается что на типичных данных разница менее 30%. Строки в 255 редко засовывают в словарь.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369126
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov,

15-30% - это мало?

Кода меньше, и работает он лучше.
А CRC32 еще и преинициализации массива требует.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369127
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatasviridenkov,

15-30% - это мало?

Кода меньше, и работает он лучше.
А CRC32 еще и преинициализации массива требует.

Это не много и не мало. Тут больше вопроса к количестве коллизий. Странно, что обычно используют CRC если есть такой простой и хороший вариант.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369128
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вообще-то это довольно старый и известный алгоритм от Роберта Седжвика .

http://snipplr.com/view/55639/hashing-function-for-c/
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369130
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и в отличие от CRC32 он заточен под WideChar.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369183
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, послушайте старого специалиста в оптимизациях
Обычно люди запарены на коллизиях. Например, в теории размер хеш-массива должна быть простым числом. Чтобы минимизировать коллизии
Однако на самом деле соотношение коллизий к прямому доступа - низкое. При том, что коллизия - это всего лишь несколько дополнительных сравнений.
Поэтому ключевой приоритет по производительности - доступ к элементу массива. Если размер хеш-массива является простым числом - то доступ к элементу осуществляется через операцию вычисления остатка от деления. То самое деление, которое выполняет ориентировочно 30 тактов. Именно поэтому ребята-хешеры, достаточно быстро перешли от простого числа к степени двойки - чтобы заменить деление обычным and.

Второй вопрос - хеш функция. В большинстве случаев подойдёт длинна и сумма байт/символов. CRC32 хорош, но он лезет в таблицу и делает много промежуточных операций. rgreat тоже классную функцию привёл, но там два умножения.
В большинстве случаев хватит этого:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function StringHash(const Value: string): Integer;
var
  i: NativeInt;
  S: PChar;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Result := PInteger(NativeInt(Value) - 4)^;

    for i := 0 to NativeInt(Result) - 1 do
    begin
      Result := Result + Ord(S[i]);
    end;
  end;
end;



Лично у меня такая функция давала отличные результаты. Но для всяких классификаторов (ИНН, КПП, автомобильные номера, номера договоров, ...) коллизий было действительно много. Длинна строк одинаковая, набор символов похожий, и в сумме хеш совпадал. И не то, чтобы производительность не устраивала, стало сложно отлаживать. Ситуация спасла привязка к индексу символа. Вот такая функция будет быстра и удобна вообще для всего )
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function StringHash(const Value: string): Integer;
var
  i: NativeInt;
  S: PChar;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Result := PInteger(NativeInt(Value) - 4)^;

    for i := 0 to NativeInt(Result) - 1 do
    begin
      Result := Result xor (Result shr (i and 7)) + Ord(S[i]);
    end;
  end;
end;
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369192
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

коллизии сильно зависят от данных, автор же вместо того, что бы рассказать больше о задаче, выгоняет всех из топика.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369199
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Не сильно
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369204
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
rgreatБыстрый хэшик для строки.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
{$OverFlowChecks OFF}
function GetHash(const Key: String): integer;
var
  a : Integer;
  i : Integer;
begin
  Result:=0;
  a:=63689;
  for i:=1 To Length(Key)-1 do begin
    Result:=Result*a+PWordArray(Key)[i];
    a:=a*378551;
  end;
end;


отличная функция ! утащил к себе в копилку
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369213
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovSOFT FOR YOUпропущено...


А ты сравни с CachedSerializer

Я же тест выложил, запусти и сравни.

Вот тест:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
program Test;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Winapi.Windows,
  System.Generics.Collections,
  System.SysUtils,
  System.Classes;

const
  ITERATIONS_COUNT = 1000000 div 10;

var
  i, k: NativeInt;
  VALUES: TArray<string>;
  Time: Cardinal;
  StringList: TStringList;
  Dictionary: TDictionary<string, Integer>;

type
  THtmlTag = (tagUnknown, tagAddress, tagBlockquote, tagBody, tagButton, tagDel, tagDiv,
    tagFieldset, tagFrame, tagFrameset, tagH1, tagH2, tagH3, tagH4, tagH5, tagHtml,
    tagImg, tagLegend, tagLi, tagMenu, tagMeta, tagOl, tagPre, tagScript, tagSmall,
    tagSpan, tagStrike, tagStyle, tagSub, tagSup, tagTable, tagTbody, tagTd, tagTextarea,
    tagTh, tagThead, tagTr, tagUl);

function StrToHtmlTag(const S: UnicodeString): THtmlTag;
type
  HugeByteArray = array[0..High(Integer) div SizeOf(Byte) - 1] of Byte;
  HugeWordArray = array[0..High(Integer) div SizeOf(Word) - 1] of Word;
  HugeCardinalArray = array[0..High(Integer) div SizeOf(Cardinal) - 1] of Cardinal;
  HugeNativeUIntArray = array[0..High(Integer) div SizeOf(NativeUInt) - 1] of NativeUInt;

  PMemoryItems = ^TMemoryItems;
  TMemoryItems = packed record
  case Integer of
    0: (Bytes: HugeByteArray);
    1: (Words: HugeWordArray);
    2: (Cardinals: HugeCardinalArray);
    3: (NativeUInts: HugeNativeUIntArray);
    4: (A1: array[1..1] of Byte;
        case Integer of
          0: (Words1: HugeWordArray);
          1: (Cardinals1: HugeCardinalArray);
          2: (NativeUInts1: HugeNativeUIntArray);
        );
    5: (A2: array[1..2] of Byte;
        case Integer of
          0: (Cardinals2: HugeCardinalArray);
          1: (NativeUInts2: HugeNativeUIntArray);
        );
    6: (A3: array[1..3] of Byte;
        case Integer of
          0: (Cardinals3: HugeCardinalArray);
          1: (NativeUInts3: HugeNativeUIntArray);
        );
  end;
var
  Len: Integer;
begin
  // default value
  Result := tagUnknown;
  if (Pointer(S) = nil) then Exit;
  Len := PInteger(NativeInt(S) - 4)^;

  // utf16 ascii
  with PMemoryItems(S)^ do
  if (Len >= 2) then
  case (Words[0]) of // "address", "blockquote", "body", "button", "del", "div", ...
    $0061: if (Len = 7) and (Cardinals2[0] = $00640064) and (Cardinals2[1] = $00650072) and
           (Cardinals2[2] = $00730073) then Result := tagAddress; // "address"
    $0062: case Len of // "body", "button", "blockquote"
             4: if (Cardinals2[0] = $0064006F) and (Words[3] = $0079) then
                Result := tagBody; // "body"
             6: if (Cardinals2[0] = $00740075) and (Cardinals2[1] = $006F0074) and
                (Words[5] = $006E) then Result := tagButton; // "button"
             10: if (Cardinals2[0] = $006F006C) and (Cardinals2[1] = $006B0063) and
                 (Cardinals2[2] = $00750071) and (Cardinals2[3] = $0074006F) and
                 (Words[9] = $0065) then Result := tagBlockquote; // "blockquote"
           end;
    $0064: if (Len = 3) then
           case (Cardinals2[0]) of // "del", "div"
             $006C0065: Result := tagDel; // "del"
             $00760069: Result := tagDiv; // "div"
           end;
    $0066: case Len of // "frame", "fieldset", "frameset"
             5: if (Cardinals2[0] = $00610072) and (Cardinals2[1] = $0065006D) then
                Result := tagFrame; // "frame"
             8: case (Cardinals2[0]) of // "fieldset", "frameset"
                  $00650069: if (Cardinals2[1] = $0064006C) and (Cardinals2[2] = $00650073) and
                             (Words[7] = $0074) then Result := tagFieldset; // "fieldset"
                  $00610072: if (Cardinals2[1] = $0065006D) and (Cardinals2[2] = $00650073) and
                             (Words[7] = $0074) then Result := tagFrameset; // "frameset"
                end;
           end;
    $0068: case Len of // "h1", "h2", "h3", "h4", "h5", "html"
             2: case (Words[1]) of // "h1", "h2", "h3", "h4", "h5"
                  $0031: Result := tagH1; // "h1"
                  $0032: Result := tagH2; // "h2"
                  $0033: Result := tagH3; // "h3"
                  $0034: Result := tagH4; // "h4"
                  $0035: Result := tagH5; // "h5"
                end;
             4: if (Cardinals2[0] = $006D0074) and (Words[3] = $006C) then
                Result := tagHtml; // "html"
           end;
    $0069: if (Len = 3) and (Cardinals2[0] = $0067006D) then Result := tagImg; // "img"
    $006C: case Len of // "li", "legend"
             2: if (Words[1] = $0069) then Result := tagLi; // "li"
             6: if (Cardinals2[0] = $00670065) and (Cardinals2[1] = $006E0065) and
                (Words[5] = $0064) then Result := tagLegend; // "legend"
           end;
    $006D: if (Len = 4) then
           if (Words[1] = $0065) then
           case (Cardinals[1]) of // "menu", "meta"
             $0075006E: Result := tagMenu; // "menu"
             $00610074: Result := tagMeta; // "meta"
           end;
    $006F: if (Len = 2) and (Words[1] = $006C) then Result := tagOl; // "ol"
    $0070: if (Len = 3) and (Cardinals2[0] = $00650072) then Result := tagPre; // "pre"
    $0073: case Len of // "sub", "sup", "span", "small", "style", "script", "strike"
             3: if (Words[1] = $0075) then
                case (Words[2]) of // "sub", "sup"
                  $0062: Result := tagSub; // "sub"
                  $0070: Result := tagSup; // "sup"
                end;
             4: if (Cardinals2[0] = $00610070) and (Words[3] = $006E) then
                Result := tagSpan; // "span"
             5: case (Cardinals2[0]) of // "small", "style"
                  $0061006D: if (Cardinals2[1] = $006C006C) then Result := tagSmall; // "small"
                  $00790074: if (Cardinals2[1] = $0065006C) then Result := tagStyle; // "style"
                end;
             6: case (Cardinals2[0]) of // "script", "strike"
                  $00720063: if (Cardinals2[1] = $00700069) and (Words[5] = $0074) then
                             Result := tagScript; // "script"
                  $00720074: if (Cardinals2[1] = $006B0069) and (Words[5] = $0065) then
                             Result := tagStrike; // "strike"
                end;
           end;
    $0074: case Len of // "td", "th", "tr", "table", "tbody", "thead", "textarea"
             2: case (Words[1]) of // "td", "th", "tr"
                  $0064: Result := tagTd; // "td"
                  $0068: Result := tagTh; // "th"
                  $0072: Result := tagTr; // "tr"
                end;
             5: case (Cardinals2[0]) of // "table", "tbody", "thead"
                  $00620061: if (Cardinals2[1] = $0065006C) then Result := tagTable; // "table"
                  $006F0062: if (Cardinals2[1] = $00790064) then Result := tagTbody; // "tbody"
                  $00650068: if (Cardinals2[1] = $00640061) then Result := tagThead; // "thead"
                end;
             8: if (Cardinals2[0] = $00780065) and (Cardinals2[1] = $00610074) and
                (Cardinals2[2] = $00650072) and (Words[7] = $0061) then
                Result := tagTextarea; // "textarea"
           end;
    $0075: if (Len = 2) and (Words[1] = $006C) then Result := tagUl; // "ul"
  end;
end;

begin
  VALUES := [
    'div',
    'span',
    'table',
    'td',
    'tr',
    'th',
    'li',
    'meta',
    'script',
    'style',
    'ol',
    'ul',
    'h1',
    'h2',
    'h3',
    'h4',
    'h5',
    'thead',
    'tbody',
    'html',
    'body',
    'blockquote',
    'address',
    'frame',
    'frameset',
    'pre',
    'button',
    'textarea',
    'strike',
    'del',
    'menu',
    'small',
    'sub',
    'sup',
    'img',
    'fieldset',
    'legend'
  ];

  try
    // бинарный поиск
    begin
      Write('Бинарный поиск(TStringList)...');
      StringList := TStringList.Create;
      try
        for k := Low(VALUES) to High(VALUES) do StringList.Add(VALUES[k]);
        StringList.Sorted := True;

        Time := GetTickCount;
        for i := 1 to ITERATIONS_COUNT do
        for k := Low(VALUES) to High(VALUES) do
        begin
          StringList.IndexOf(VALUES[k]);
        end;
        Time := GetTickCount - Time;
        Writeln(' ', Time, 'мс');
      finally
        StringList.Free;
      end;
    end;

    // хеш
    begin
      Write('Хеш поиск(Dictionary)...');
      Dictionary := TDictionary<string, Integer>.Create;
      try
        for k := Low(VALUES) to High(VALUES) do
          Dictionary.Add(VALUES[k], 0);

        Time := GetTickCount;
        for i := 1 to ITERATIONS_COUNT do
        for k := Low(VALUES) to High(VALUES) do
        begin
          Dictionary.Items[VALUES[k]];
        end;
        Time := GetTickCount - Time;
        Writeln(' ', Time, 'мс');
      finally
        Dictionary.Free;
      end;
    end;

    // кодогенерация
    begin
      Write('Кодогенерация(CachedSerializer)...');

      Time := GetTickCount;
      for i := 1 to ITERATIONS_COUNT do
      for k := Low(VALUES) to High(VALUES) do
      begin
        StrToHtmlTag(VALUES[k]);
      end;
      Time := GetTickCount - Time;
      Writeln(' ', Time, 'мс');
    end;

    // нажать Enter
    Writeln;
    Write('Press Enter');
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.



Вот результаты:
Код: plaintext
1.
2.
3.
4.
Бинарный поиск(TStringList)... 2044мс
Хеш поиск(Dictionary)... 172мс
Кодогенерация(CachedSerializer)... 15мс

Press Enter
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369229
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUВот такая функция будет быстра и удобна вообще для всего
SOFT FOR YOUНе сильно
Ты хоть проверял, то о чём говоришь? Твоя функция на наборе последовательно изменяющихся ключей с общей частью просто сосёт. На наборе размером в 1млн. ключей (Index1 .. Index1000000) она даёт только 145 уникальных хешей, тогда как Седжвик даёт 999994. То есть, у твоей функции на этом наборе будет 999855 коллизий, а у Седжвика всего 6. На рандомных ключах (GUID) и с тем же размером набора в 1 млн., твоя функция даёт всего 244 уникальных хеша (999756 коллизий), Седжвик даёт 999871 (129 коллизий).
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369236
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для прикола ещё и на английском словаре проверил. Размер словаря 30322 слова. У твоей функции всего 661 уникальный хеш (29661 коллизий), у Седжвика 30322 (коллизий нет).
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369239
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Код/данные в студию
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369240
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Понял
Попробуй вот так :)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function StringHash(const Value: string): Integer;
var
  i: NativeInt;
  S: PChar;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Result := PInteger(NativeInt(Value) - 4)^;

    for i := 0 to NativeInt(Result) - 1 do
    begin
      Result := Result xor (Result shr (i and 7 + 1)) + Ord(S[i]);
    end;
  end;
end;
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369242
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUKazantsev Alexey,

Понял
Попробуй вот так

что там с твоим титаником ? можно забить или есть шанс ?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369243
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUКод/данные в студию
Какие данные тебе нужны?
Код: pascal
1.
SetLength(keys, 1000000);


Миллион GUID'ов:
Код: pascal
1.
2.
for i := low(keys) to high(keys) do
 keys[i] := TGuid.NewGuid.ToString;


Последовательные ключи:
Код: pascal
1.
2.
for i := low(keys) to high(keys) do
 keys[i] := 'Index' + IntToStr(i);



Хеши сам посчитай.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369245
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorSOFT FOR YOUKazantsev Alexey,

Понял
Попробуй вот так

что там с твоим титаником ? можно забить или есть шанс ?

Скинь свой проект, я буду его трейсить
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369246
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOUКод/данные в студию
Какие данные тебе нужны?
Код: pascal
1.
SetLength(keys, 1000000);


Миллион GUID'ов:
Код: pascal
1.
2.
for i := low(keys) to high(keys) do
 keys[i] := TGuid.NewGuid.ToString;


Последовательные ключи:
Код: pascal
1.
2.
for i := low(keys) to high(keys) do
 keys[i] := 'Index' + IntToStr(i);



Хеши сам посчитай.

Харе лениться. Заколебали
Выложи dpr. Ещё я коллизии не считал
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369247
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecatorпропущено...


что там с твоим титаником ? можно забить или есть шанс ?

Скинь свой проект, я буду его трейсить
хм....может быть, ещё и ключи от квартиры, где деньги лежат ? (с)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369248
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorSOFT FOR YOUпропущено...


Скинь свой проект, я буду его трейсить
хм....может быть, ещё и ключи от квартиры, где деньги лежат ? (с)

Почему нет?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369249
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUПопробуй вот так :)
Стало чуть лучше, но всё равно отстой:
рандомные ключи 1млн: 7091 уникальный хеш
последовательные 1млн: 348 уникальных хешей
английский словарь 30322: 1580 уникальных хешей
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369250
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecatorпропущено...

хм....может быть, ещё и ключи от квартиры, где деньги лежат ? (с)

Почему нет?
потому что - нет
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369251
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOUПопробуй вот так :)
Стало чуть лучше, но всё равно отстой:
рандомные ключи 1млн: 7091 уникальный хеш
последовательные 1млн: 348 уникальных хешей
английский словарь 30322: 1580 уникальных хешей

А замер скорости времени поиска?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369254
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUKazantsev Alexeyпропущено...

Стало чуть лучше, но всё равно отстой:
пропущено...


А замер скорости времени поиска?
зачем нужен замер скорости, если сам хеш - говно ?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369256
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUХаре лениться. Заколебали
Выложи dpr.
Мне лень переводить подсчёт коллизий со своей структуры на словарь. Поэтому нет.

SOFT FOR YOUЕщё я коллизии не считал
Дело хозяйское.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369258
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUА замер скорости времени поиска?
Какой ещё замер скорости??? У тебя там сплошные коллизии.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369260
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorSOFT FOR YOUпропущено...


А замер скорости времени поиска?
зачем нужен замер скорости, если сам хеш - говно ?

У меня в оригинале rol и bswap. Что в упрощенном паскале коллизий много - я удивлён
Нужен тестовый проект со скоростью поиска и с подсчётом коллизий. Можно будет посмотреть, что не так, докрутить функцию
И сравнить варианты между собой
Может Алексей что-то не так написал
А то без проекта можно с тем же успехом брать цифры с потолка и сюда постить
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369261
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUА то без проекта можно с тем же успехом брать цифры с потолка и сюда постить

тебе код привёл, вставь в пустой проект эти 8 строчек
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369262
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUМожет Алексей что-то не так написал
А то без проекта можно с тем же успехом брать цифры с потолка и сюда постить
Я тебе все вводные дал - проверяй.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369271
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, вот вариант с 1 умножением:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function StringHash(const Value: string): Integer;
var
  i: Integer;
  S: PChar;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Result := PInteger(NativeInt(Value) - 4)^;

    for i := 1 to Result do
    begin
      Result := Result * i + Ord(S^);
      Inc(S);
    end;
  end;
end;



Уникальных: 999772, коллизий: 228
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369273
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Справедливости ради стоит сказать, что коллизии нужно считать не по хешу, а по младшим битам хеша в соответствии с размером таблицы
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369274
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЛадно, вот вариант с 1 умножением:
...
Уникальных: 999772, коллизий: 228
Ну это на рандомных ключах, а на последовательных и на словаре всё равно дофига коллизий.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369275
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUколлизии нужно считать не по хешу, а по младшим битам хеша в соответствии с размером таблицы
Сам-то понял, что сказал? Если у тебя хеши одинаковые, то и вход в таблицу ты получишь один и тот же.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369276
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOUЛадно, вот вариант с 1 умножением:
...
Уникальных: 999772, коллизий: 228
Ну это на рандомных ключах, а на последовательных и на словаре всё равно дофига коллизий.

Так я тебе поэтому и говорю
Код в студию
И замер времени поиска
Коллизий может быть сколько угодно, в конечном счёте важна скорость поиска
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369277
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOUколлизии нужно считать не по хешу, а по младшим битам хеша в соответствии с размером таблицы
Сам-то понял, что сказал? Если у тебя хеши одинаковые, то и вход в таблицу ты получишь один и тот же.

Я к тому, что приведённый твой волшебный хеш на самом деле даёт значительно больше коллизий, чем ты думаешь
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369280
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUКоллизий может быть сколько угодно, в конечном счёте важна скорость поиска
SOFT FOR YOUЯ к тому, что приведённый твой волшебный хеш на самом деле даёт значительно больше коллизий, чем ты думаешь
Коллизия хеша однозначно приведёт к замедлению поиска. Это аксиома. Аксиомы доказательств не требуют. И кстати, тут никто не говорил, что у хорошей хеш-функции не будет коллизий при получении входа в таблицу (по крайней мере до тех пор, пока размерность хеша не совпадёт с размерностью таблицы), но у плохой их будет ещё больше.

Я сейчас попробовал заменить в своей таблице хеш Седжвика на твою функцию. До этого момента она в поиске была быстрее TDictionary на 159%, на последовательных ключах. C твоей функцией (последним её вариантом) я вообще не смог дождаться заполнения таблицы. Закономерный результат.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369283
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOUКоллизий может быть сколько угодно, в конечном счёте важна скорость поиска
SOFT FOR YOUЯ к тому, что приведённый твой волшебный хеш на самом деле даёт значительно больше коллизий, чем ты думаешь
Коллизия хеша однозначно приведёт к замедлению поиска. Это аксиома. Аксиомы доказательств не требуют. И кстати, тут никто не говорил, что у хорошей хеш-функции не будет коллизий при получении входа в таблицу (по крайней мере до тех пор, пока размерность хеша не совпадёт с размерностью таблицы), но у плохой их будет ещё больше.

Я сейчас попробовал заменить в своей таблице хеш Седжвика на твою функцию. До этого момента она в поиске была быстрее TDictionary на 159%, на последовательных ключах. C твоей функцией (последним её вариантом) я вообще не смог дождаться заполнения таблицы. Закономерный результат.

Если на одну позицию хеш-таблицы есть 1000 элементов - тогда да
А если на одну позицию ~2 элемента - тогда скорость поиска упирается в скорость функции. А для строк - это цикл по символам
У тебя синдром defecator-а? Сложно выложить тестовый проект?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369285
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот проект по коллизиям
Хеш корректируется под размер таблицы (1048576)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
program Hash;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Winapi.Windows,
  System.Generics.Collections,
  System.SysUtils,
  System.Classes;

const
  KEYS_COUNT = 1000000;

var
  i: NativeInt;
  HashValue: Integer;
  Keys: TArray<string>;
  Dictionary: TDictionary<Integer, Integer>;

function StringHash(const Value: string): Integer;
var
  i, X, Count: Integer;
  S: PByte;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Count := PInteger(NativeInt(Value) - 4)^;

    Result := Count;
    for i := 1 to (Count shr (SizeOf(Char) xor 3)) do
    begin
      X := Result xor PInteger(S)^;
      Result := Result * i;
      Inc(Result, X shr 19);
      Inc(S, SizeOf(Integer));
      Inc(Result, X);
    end;

    for i := 1 to (Count and ((SizeOf(Char) xor 2) or 1)) do
    begin
      Result := Result * i;
      Inc(Result, Ord(PChar(S)^));
      Inc(S, SizeOf(Char));
    end;
  end;
end;

function GetHash(const Key: string): Integer;
var
  a: Integer;
  i: Integer;
begin
  Result := 0;
  a := 63689;
  for i := 1 to Length(Key) - 1 do
  begin
    Result := Result * a + PWordArray(Key)[i];
    a := a * 378551;
  end;
end;

begin
  try
    // заполнение
    SetLength(Keys, KEYS_COUNT);
    for i := Low(Keys) to High(Keys) do
      Keys[i] := TGuid.NewGuid.ToString;

    // уникальные
    Dictionary := TDictionary<Integer, Integer>.Create;
    try
      for i := Low(Keys) to High(Keys) do
      begin
        HashValue := StringHash{GetHash}(Keys[i]) and (1024 * 1024 - 1);
        Dictionary.AddOrSetValue(HashValue, 0);
      end;

      Writeln('Уникальных: ', Dictionary.Count, ', коллизий: ', KEYS_COUNT - Dictionary.Count);
    finally
      Dictionary.Free
    end;

    // нажать Enter
    Write('Press Enter');
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.



Код: plaintext
1.
2.
3.
StringHash:
Уникальных: 641331, коллизий: 358669
GetHash:
Уникальных: 644653, коллизий: 355347

Отдельно публикую быстрый StringHash
Работает по 4 байтам за итерацию, одно умножение, понимает как Unicode-версию Delphi, так и Ansi
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
function StringHash(const Value: string): Integer;
var
  i, X, Count: Integer;
  S: PByte;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Count := PInteger(NativeInt(Value) - 4)^;

    Result := Count;
    for i := 1 to (Count shr (SizeOf(Char) xor 3)) do
    begin
      X := Result xor PInteger(S)^;
      Result := Result * i;
      Inc(Result, X shr 19);
      Inc(S, SizeOf(Integer));
      Inc(Result, X);
    end;

    for i := 1 to (Count and ((SizeOf(Char) xor 2) or 1)) do
    begin
      Result := Result * i;
      Inc(Result, Ord(PChar(S)^));
      Inc(S, SizeOf(Char));
    end;
  end;
end;
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369306
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЕсли на одну позицию хеш-таблицы есть 1000 элементов - тогда да
А если на одну позицию ~2 элемента - тогда скорость поиска упирается в скорость функции. А для строк - это цикл по символам
В скорость функции всё упрётся только тогда, когда каждому выданному хешу будет соответствовать незанятая точка входа. В противном случае, чем больше коллизий даёт функция, тем медленнее работает таблица.

SOFT FOR YOUСложно выложить тестовый проект?
Сложно.

SOFT FOR YOUВот проект по коллизиям
Хеш корректируется под размер таблицы (1048576)

Подгоняем условия под результат? И снова удобные рандомные ключи На последовательных сделай, и посмотри. И кстати, не у всех таблиц внутренний размер кратен степени двойки.

Кстати, вот тебе для облегчения задачи готовый компарер для TDictionary:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
type
 TStringComparer = Class(TEqualityComparer<String>)
   function Equals(const Left, Right: String): Boolean; Override;
   function GetHashCode(const Value: String): Integer;Override;
 End;

{ TStringComparer }

function TStringComparer.Equals(const Left, Right: String): Boolean;
begin
 result := Left = Right;
end;

function TStringComparer.GetHashCode(const Value: String): Integer;
begin
 result := StringHash(value);
end;


Тестируем с последовательными ключами. С Седжвиком TDictionary ускоряется вдвое. С твоей функцией... сам проверь, если дождаться заполнения сумеешь. Моя таблица с твоим хешем медленне в 78(!) раз чем с Седжвиком. Ну и в качестве пищи для размышлений: TDictionary имеет размер внутренней таблицы кратный степени двойки, моя таблица нет. Удачи.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369324
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOUЕсли на одну позицию хеш-таблицы есть 1000 элементов - тогда да
А если на одну позицию ~2 элемента - тогда скорость поиска упирается в скорость функции. А для строк - это цикл по символам
В скорость функции всё упрётся только тогда, когда каждому выданному хешу будет соответствовать незанятая точка входа. В противном случае, чем больше коллизий даёт функция, тем медленнее работает таблица.

Чем по твоему грозит коллизия в "ячейке"?
Только тем, что будет вызвано на N сравнений больше, когда будет проход по записям с одинаковым хешем

Kazantsev AlexeySOFT FOR YOUСложно выложить тестовый проект?
Сложно.

Бред какой-то

Kazantsev AlexeySOFT FOR YOUВот проект по коллизиям
Хеш корректируется под размер таблицы (1048576)

Подгоняем условия под результат? И снова удобные рандомные ключи На последовательных сделай, и посмотри. И кстати, не у всех таблиц внутренний размер кратен степени двойки.

Причём здесь подгоняем? 1048576 - это следующее кратное 2 число после миллиона
Покажи хоть один промышленный хеш-массив с размером не равным степени двойки. И давай замерим его производительность
И что удобного в рандомных ключах? Там одинаковая длина и диапазон символов - 17
Где ты видел миллион строк "Index" + i ?
Даже миллион гвидов - задача, притянутая за уши. Ты же предлагаешь всерьёз воспринимать то, что реалиям не имеет никакого отношения. Но я согласен, в этих случаях лучше Седжвик

Kazantsev AlexeyТестируем с последовательными ключами. С Седжвиком TDictionary ускоряется вдвое. С твоей функцией... сам проверь, если дождаться заполнения сумеешь. Моя таблица с твоим хешем медленне в 78(!) раз чем с Седжвиком. Ну и в качестве пищи для размышлений: TDictionary имеет размер внутренней таблицы кратный степени двойки, моя таблица нет. Удачи.

Нет проекта - нет дискуссии
"Index" + i не имеют ничего общего с реальностью
Имеет значение не скорость добавления, а скорость поиска
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369329
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С Седжвиком TDictionary ускоряется вдвое.

Сейчас проверил на своем примере, с при подстановке компаратора с Седжвиком, поиск стал медленнее в 1.5 раза
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369332
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov,

А что было до Седжвика?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369336
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatasviridenkov,

А что было до Седжвика?

Дефолтный компарер
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369341
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov,

А который у тебя дефорлтный?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369343
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatasviridenkov,

А который у тебя дефорлтный?

Почему у меня, у TDictionary. Не знаю, что именно там.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369344
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЧем по твоему грозит коллизия в "ячейке"?
Только тем, что будет вызвано на N сравнений больше, когда будет проход по записям с одинаковым хешем
Ох и трудный же ты... Отсутствие коллизии хеша не гарантирует отсутствия коллизии на точке входа, зато коллизия хеша её присутствие гарантирует.

SOFT FOR YOUБред какой-то
Бред, это твой хеш.

SOFT FOR YOUПокажи хоть один промышленный хеш-массив с размером не равным степени двойки. И давай замерим его производительность
Я тебе ничего доказывать не собираюсь. У меня таблица именно такая, и насколько она опережает TDictionary я уже писал.

SOFT FOR YOUИ что удобного в рандомных ключах? Там одинаковая длина и диапазон символов - 17
А подумать? Идентификаторы сессий/объектов/дачегоугодновообще на сервере.

SOFT FOR YOUГде ты видел миллион строк "Index" + i ?
Это лишь синтетический пример. Последовательные ключи или ключи с постоянной частью это реальная проблема для хеш-функций. Ты бы знал об этом, если бы читал что-нибудь по теме. Поэтому универсальные хеши всегда тестируют на разных наборах данных, а не только на удобных.

SOFT FOR YOUНет проекта - нет дискуссии
Да бога ради. Если для тебя сложно вставить свой хеш в готовый компарер и проинициализировать им словарь, тут действительно не о чем больше говорить.

SOFT FOR YOUИмеет значение не скорость добавления, а скорость поиска
Мы бы и померили скорость поиска, если бы смогли заполнить таблицу с твоим хешем. Проблема в том, что я так долго ждать не могу
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369345
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatБыстрый хэшик для строки.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
{$OverFlowChecks OFF}
function GetHash(const Key: String): integer;
var
  a : Integer;
  i : Integer;
begin
  Result:=0;
  a:=63689;
  for i:=1 To Length(Key)-1 do begin
    Result:=Result*a+PWordArray(Key)[i];
    a:=a*378551;
  end;
end;



А ведь кто-то может утащить в копилку алгоритм с ошибой )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369348
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyА подумать? Идентификаторы сессий/объектов/дачегоугодновообще на сервере.
Integer?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369349
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovСейчас проверил на своем примере, с при подстановке компаратора с Седжвиком, поиск стал медленнее в 1.5 раза
Ничего удивительного. Дефолтный Дженкинс тоже очень хороший хеш. Кстати, в твоём примере словарь слишком маленький, выгоднее было бы захардкодить.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369353
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня простейший словарь: таблица + цепочки. Использую простые числа для размерности таблицыю Юзается Elf. Прикол в правильном подборе размера таблицы. Рядом стоящие простые числа могут давать (на моих данных) от 0 до нескольких тысяч коллизий. Мурмуры, дженкинсы, crc, дотнетовские варианты более устойчивы к размеру таблицы
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369357
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUInteger?
Слишком маленький диапазон значений. Большая вероятность коллизий при генерации на разных машинах.

А вообще, рандомные ключи удобны для твоего хеша - на них коллизий мало (в последнем варианте).
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369361
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerУ меня простейший словарь: таблица + цепочки.
У меня первая версия тоже с цепочками была. Но тут есть одна проблема - невозможно гарантировать отсутствие реаллокаций после задания вместимости (capacity) таблицы. В таблице с прямой адресацией такая возможность есть + есть возможность делать перестроение таблицы тоже без реаллокаций.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369365
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovА ведь кто-то может утащить в копилку алгоритм с ошибой )
Вот тут правильный Седжвик :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369369
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyasviridenkovСейчас проверил на своем примере, с при подстановке компаратора с Седжвиком, поиск стал медленнее в 1.5 раза
Ничего удивительного. Дефолтный Дженкинс тоже очень хороший хеш. Кстати, в твоём примере словарь слишком маленький, выгоднее было бы захардкодить.

Нельзя захардкодить, смысл в том, что он может расширяться в процессе работы. Если для html это еще экзотика (хотя кастомные теги исключать нельзя) то для XML вообще каждый раз все свое.
Я уже писал, что пока остановился на trie, для подобного набора коротких ключей, мне кажется это оптимальный вариант.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369375
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так :)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
program SpeedTest;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Winapi.Windows,
  System.Generics.Defaults,
  System.Generics.Collections,
  System.SysUtils,
  System.Classes;

type
  TStringEqualComparer = class(TInterfacedObject)
    function Equals(const Left, Right: string): Boolean; reintroduce;
    // важно! если сделать виртуальный метод - то скорость падает ~3 раза
    // function GetHashCode(const Value: string): Integer; reintroduce; virtual; abstract;
  end;
  TComparerClass = class of TStringEqualComparer;

  TSedgwicComparer = class(TStringEqualComparer, IEqualityComparer<string>)
    function GetHashCode(const Value: string): Integer; reintroduce;
  end;

  TSimpleComparer = class(TStringEqualComparer, IEqualityComparer<string>)
    function GetHashCode(const Value: string): Integer; reintroduce;
  end;

  TShiftComparer = class(TStringEqualComparer, IEqualityComparer<string>)
    function GetHashCode(const Value: string): Integer; reintroduce;
  end;

  TFastComparer = class(TStringEqualComparer, IEqualityComparer<string>)
    function GetHashCode(const Value: string): Integer; reintroduce;
  end;

{ TStringEqualComparer }

function TStringEqualComparer.Equals(const Left, Right: string): Boolean;
label
  cmp_ptrs;
var
  i, Count: NativeInt;
  S1, S2: PNativeUInt;
begin
  S1 := Pointer(Left);
  S2 := Pointer(Right);
  if (S1 <> S2) and (S1 <> nil) and (S2 <> nil) then
  begin
    Dec(NativeUInt(S1), SizeOf(Integer));
    Dec(NativeUInt(S2), SizeOf(Integer));
    Count := PInteger(S1)^;
    if (Integer(Count) <> PInteger(S2)^) then goto cmp_ptrs;
    Inc(NativeUInt(S1), SizeOf(Integer));
    Inc(NativeUInt(S2), SizeOf(Integer));

    for i := 1 to Count shr {$if SizeOf(NativeUInt) = 8}2{$else}1{$endif} do
    begin
      if (S1^ <> S2^) then goto cmp_ptrs;
      Inc(S1);
      Inc(S2);
    end;

    {$if SizeOf(NativeUInt) = 8}
    if (Count and 2 <> 0) then
    begin
      if (PCardinal(S1)^ <> PCardinal(S2)^) then goto cmp_ptrs;
      Inc(NativeUInt(S1), SizeOf(Cardinal));
      Inc(NativeUInt(S2), SizeOf(Cardinal));
    end;
    {$endif}

    if (PWord(S1)^ <> PWord(S2)^) then goto cmp_ptrs;
    Result := True;
    Exit;
  end else
  begin
  cmp_ptrs:
    Result := (S1 = S2);
  end;
end;

{ TSedgwicComparer }

function TSedgwicComparer.GetHashCode(const Value: string): Integer;
var
  a, i: Integer;
begin
  Result := 0;
  a := 63689;
  for i := 1 to Length(Value) - 1 do
  begin
    Result := Result * a + PWordArray(Value)[i];
    a := a * 378551;
  end;
end;

{ TSimpleComparer }

function TSimpleComparer.GetHashCode(const Value: string): Integer;
var
  i: NativeInt;
  S: PChar;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Result := PInteger(NativeInt(Value) - 4)^;

    for i := 0 to NativeInt(Result) - 1 do
    begin
      Result := Result + Ord(S[i]);
    end;
  end;
end;

{ TShiftComparer }

function TShiftComparer.GetHashCode(const Value: string): Integer;
var
  i: NativeInt;
  S: PChar;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Result := PInteger(NativeInt(Value) - 4)^;

    for i := 0 to NativeInt(Result) - 1 do
    begin
      Result := Result xor (Result shr (i and 7 + 1)) + Ord(S[i]);
    end;
  end;
end;

{ TFastComparer }

function TFastComparer.GetHashCode(const Value: string): Integer;
var
  i, X, Count: Integer;
  S: PByte;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Count := PInteger(NativeInt(Value) - 4)^;

    Result := Count;
    for i := 1 to (Count shr (SizeOf(Char) xor 3)) do
    begin
      X := Result xor PInteger(S)^;
      Result := Result * i;
      Inc(Result, X shr 19);
      Inc(S, SizeOf(Integer));
      Inc(Result, X);
    end;

    for i := 1 to (Count and ((SizeOf(Char) xor 2) or 1)) do
    begin
      Result := Result * i;
      Inc(Result, Ord(PChar(S)^));
      Inc(S, SizeOf(Char));
    end;
  end;
end;


const
  ITERATIONS_COUNT = 1000000;
  COMPARERS: array[0..4] of TComparerClass = (nil, TSedgwicComparer, TSimpleComparer, TShiftComparer, TFastComparer);

var
  i, c, k: NativeInt;
  VALUES: TArray<string>;
  Time: Cardinal;
  Dictionary: TDictionary<string, Integer>;

begin
  VALUES := [
    'div',
    'span',
    'table',
    'td',
    'tr',
    'th',
    'li',
    'meta',
    'script',
    'style',
    'ol',
    'ul',
    'h1',
    'h2',
    'h3',
    'h4',
    'h5',
    'thead',
    'tbody',
    'html',
    'body',
    'blockquote',
    'address',
    'frame',
    'frameset',
    'pre',
    'button',
    'textarea',
    'strike',
    'del',
    'menu',
    'small',
    'sub',
    'sup',
    'img',
    'fieldset',
    'legend'
  ];

  try
    // цикл по всем компарерам
    for c := Low(COMPARERS) to High(COMPARERS) do
    begin
      // конструктор, инфо
      if (COMPARERS[c] = nil) then
      begin
        Write('Default', '...');
        Dictionary := TDictionary<string, Integer>.Create;
      end else
      begin
        Write(COMPARERS[c].ClassName, '...');
        case c of
          1: Dictionary := TDictionary<string, Integer>.Create(TSedgwicComparer.Create);
          2: Dictionary := TDictionary<string, Integer>.Create(TSimpleComparer.Create);
          3: Dictionary := TDictionary<string, Integer>.Create(TShiftComparer.Create);
        else
          // 4:
          Dictionary := TDictionary<string, Integer>.Create(TFastComparer.Create);
        end;
      end;

      try
        // заполняем
        for k := Low(VALUES) to High(VALUES) do
          Dictionary.Add(VALUES[k], 0);

        // тестируем
        Time := GetTickCount;
        for i := 1 to ITERATIONS_COUNT do
        for k := Low(VALUES) to High(VALUES) do
        begin
          Dictionary.Items[VALUES[k]];
        end;
        Time := GetTickCount - Time;
        Writeln(' ', Time, 'мс');

      finally
        Dictionary.Free;
      end;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

  // нажать Enter
  Writeln;
  Write('Press Enter');
  Readln;
end.



Код: plaintext
1.
2.
3.
4.
Default... 1794мс
TSedgwicComparer... 624мс
TSimpleComparer... 624мс
TShiftComparer... 827мс
TFastComparer... 577мс
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369377
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x64:

Код: plaintext
1.
2.
3.
4.
Default... 1779мс
TSedgwicComparer... 639мс
TSimpleComparer... 577мс
TShiftComparer... 702мс
TFastComparer... 562мс
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369387
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUКак-то так :)
Седжвик неправильный.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369393
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOUКак-то так :)
Седжвик неправильный.
Чего в нем не так?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369395
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Компа род рукой нет, чтобы проверить.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369396
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatKazantsev Alexeyпропущено...

Седжвик неправильный.
Чего в нем не так?

Верхний индекс.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369397
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOUКак-то так :)
Седжвик неправильный.

Точно. С нуля же надо начать

x86:
Код: plaintext
1.
2.
3.
4.
Default... 1778мс
TSedgwicComparer... 687мс
TSimpleComparer... 624мс
TShiftComparer... 795мс
TFastComparer... 593мс

x64:
Код: plaintext
1.
2.
3.
4.
Default... 1778мс
TSedgwicComparer... 609мс
TSimpleComparer... 577мс
TShiftComparer... 702мс
TFastComparer... 562мс
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369402
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov,

Я тут для тебе кодогенерил
Мне удалось объяснить, почему кодогенерация лучше хеша?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369406
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUasviridenkov,

Я тут для тебе кодогенерил
Мне удалось объяснить, почему кодогенерация лучше хеша?

Да, спасибо. Но как я уже писал, в моих ситуациях это не подходит, т.к. нужна расширяемость словаря.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369407
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov,

Ну у тебя константный набор тегов. В HTML вроде
А для расширения - можно совмещать подходы. Вернула StrToHtmlTag значение tagUnknown - значит мутить что-то дальше
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369426
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUasviridenkov,

Ну у тебя константный набор тегов. В HTML вроде
А для расширения - можно совмещать подходы. Вернула StrToHtmlTag значение tagUnknown - значит мутить что-то дальше

Не константный, а усложнять городя иерархические конструкции - смысла нет, выигрыш на копейку.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369430
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov,

Смысла как минимум в 10 раз
Но правда я не знаю, насколько это актуально у тебя
Ты же сам начал говорить про скорость хеша )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369440
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хардкодинг при всей своей производительности хорош пока не вылез за пределы своей песочницы. В компаниях/промышленности он на фиг не упирался. Там другие критерии. Главное универсальность, расширяемость и главное стоимость сопровождения.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369448
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUasviridenkov,

Смысла как минимум в 10 раз
Но правда я не знаю, насколько это актуально у тебя
Ты же сам начал говорить про скорость хеша )

Про скорость хеша это я применительно к другим вещам говорил, иногда критична скорость добавления (не здесь).
А в данном случае, ускорение в 10 раз даст не более 5 процентов во времени парсинга.
Которое на порядок меньше времени расчета стилей, которое в свою очередь еще в разы меньше чем расчет layout-а.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369449
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

Главное, использовать инструменты согласно задачам
Микроскоп - для одного. Молоток - для другого.
Ты же рассуждаешь о молотке как о лучшем инструменте для всех задач класса сферического коня в вакууме
Сериализирующая кодогенерация нужна для максимально быстрой идентификации заранее известного набора строк. И со своей задачей оно справляется на отличненько, да так, что даже самый лучший хеш нервно курит в сторонке
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369453
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUы же рассуждаешь о молотке как о лучшем инструменте для всех задач класса сферического коня в вакуумеТы не понял меня. Перечитай ещё раз. А также подумай почему майкрософт, эмбаркадеро, и все столпы программирования предлагают эту парадигму, а не хардкодинг, который, повторю ещё раз, может встречаться глубоко внутри и ни разу наружу
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369454
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUы же рассуждаешь о молотке как о лучшем инструменте для всех задач класса сферического коня в вакуумеТы не понял меня. Перечитай ещё раз. А также подумай почему майкрософт, эмбаркадеро, и все столпы программирования предлагают эту парадигму, а не хардкодинг, который, повторю ещё раз, может встречаться глубоко внутри и ни разу наружу
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369455
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно почему пост продублировался?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39369464
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

Я думаю, ты и сам себя не понял )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39376154
серчер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaon
я никого не выгонял из топика. Напротив, он неплохо разросся, потому что задача и смысл задачи представляет немалый интерес.
Просто ты зачем-то стал общаться фамильярно. Можно было бы эмоции и свое отношение оставить при себе, ты же не женщина, которая не умеет держать себя в руках. Ну или в одной)))

Мы с ребятами на работе тоже посидели-подумали. Вариантов напридумывали.

Самый интересный оказался - матрица. Если длина фиксирована и представляет собой цифры (вообще это номера телефонов), то можно создать матрицу массивов с быстрым доступом по индексу позиции искомой цифры и проверке по значению. И память минимизировать до 9 байт по сути на хранение телефона.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39376167
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчер makhaon
я никого не выгонял из топика. Напротив, он неплохо разросся, потому что задача и смысл задачи представляет немалый интерес.
Просто ты зачем-то стал общаться фамильярно. Можно было бы эмоции и свое отношение оставить при себе, ты же не женщина, которая не умеет держать себя в руках. Ну или в одной)))

Мы с ребятами на работе тоже посидели-подумали. Вариантов напридумывали.

Самый интересный оказался - матрица. Если длина фиксирована и представляет собой цифры (вообще это номера телефонов), то можно создать матрицу массивов с быстрым доступом по индексу позиции искомой цифры и проверке по значению. И память минимизировать до 9 байт по сути на хранение телефона.

В таком случае можно написать аналог TDictionary, в котором номер телефона играет одновременно роль хеша, ключа и данных. И память сократить до 4 байт на номер. Даже с учетом коэффициента заполнения потребуется меньше. И быстрее будет, наверное.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39376203
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчервообще это номера телефоновя делал массив на 120 МБ, в котором хранятся биты по всем сотовым номерам России + хеш-таблицу из строк для всех "несотовых"
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39376215
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00ch,

MNP?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39376235
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerинтересно почему пост продублировался?

коллизия хэша
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39376240
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov, а при чем тут это?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39376256
серчер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksandr Sharahovсерчер makhaon
я никого не выгонял из топика. Напротив, он неплохо разросся, потому что задача и смысл задачи представляет немалый интерес.
Просто ты зачем-то стал общаться фамильярно. Можно было бы эмоции и свое отношение оставить при себе, ты же не женщина, которая не умеет держать себя в руках. Ну или в одной)))

Мы с ребятами на работе тоже посидели-подумали. Вариантов напридумывали.

Самый интересный оказался - матрица. Если длина фиксирована и представляет собой цифры (вообще это номера телефонов), то можно создать матрицу массивов с быстрым доступом по индексу позиции искомой цифры и проверке по значению. И память минимизировать до 9 байт по сути на хранение телефона.

В таком случае можно написать аналог TDictionary, в котором номер телефона играет одновременно роль хеша, ключа и данных. И память сократить до 4 байт на номер. Даже с учетом коэффициента заполнения потребуется меньше. И быстрее будет, наверное.

Это как же до 4 байт? Это в смысле если убрать 79 в начале? Иначе в 4 байта не уместиться.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39376261
серчер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fd00chсерчервообще это номера телефоновя делал массив на 120 МБ, в котором хранятся биты по всем сотовым номерам России + хеш-таблицу из строк для всех "несотовых"

"биты по всем сотовым номерам"? Я не очень понял эту фразу. Слишком захешировано.) Расхешируй )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39376269
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчер"биты по всем сотовым номерам"? Я не очень понял эту фразу. Слишком захешировано.) Расхешируйм.б. битсет?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39376270
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серчер, ты выше ее расхешировал))серчерЭто в смысле если убрать 79 в началеполучится диапазон в 1 млрд номеров или бит, т.е. 120 МБ памяти
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39376282
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
удобно с нашими короткими номерами
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39376328
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00chasviridenkov, а при чем тут это?

Один из вариантов, для чего нужна база всех сотовых РФ (а не кодов).
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380372
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

вот ты гад, задел меня за живое своими хеш-функциями,
больше года держался, а тут на тебе:

http://guildalfa.ru/alsha/node/32
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380398
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov, Delphi 7 и RawByteString?

Проверил коллизи функций:
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380420
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Ага, у меня объявлено RawByteString=AnsiString для совместимости с другими юнитами, которые обычно использую.

Ну, по коллизиям не хуже Седжвика, по крайней мере.

Но там главное не только коллизии, а как оно ляжет в таблицу (длина наибольшего кластера).
От этого зависит скорость вставки-удаления. Скорость поиска и так всегда была отличная.

На самом деле у меня, пока тестирую, все функции параметрические.
Сейчас имеется куча найденных значений параметров с примерно одинаковыми характеристиками на словаре Лопатина.
Так что если есть готовые словари в текстовом виде (в строке одно слово и ничего больше), то можно из этой кучи выбрать то, что работает хорошо на всем множестве словарей.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380436
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Хорошая статейка
Только нужен тестовый проект с исходными данными
И не понятно, почему нет функции, где обрабатывается 4 байта за итерацию
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380445
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovНу, по коллизиям не хуже Седжвика, по крайней мере.
Хорошая, судя по всему, функция. Посмотрел распределение - тоже лучше Седжвика.

Aleksandr SharahovНо там главное не только коллизии, а как оно ляжет в таблицу (длина наибольшего кластера).
Разумеется, но каждая коллизия увеличивает размер/способствует образованию кластера, плюс добавляет проверку ключа.

Aleksandr SharahovТак что если есть готовые словари в текстовом виде (в строке одно слово и ничего больше), то можно из этой кучи выбрать то, что работает хорошо на всем множестве словарей.
А можно этот словарь выложить? Я бы тоже свою таблицу погонял.
Я словари брал тут (обратный словарь) и тут (фамилии).
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380450
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал ещё карты распределений:
RSHash(UTF16)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380451
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHAPFCT(1251):
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380452
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TFastComparer.GetHashCode отсюда :
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380453
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380454
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Распределение на обратном словаре.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380455
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дефолтный дельфийский Дженкинс:
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380458
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Когда ты напишешь функцию с обработкой 4 байта за итерацию,
не порождающую больших кластеров в хеш-таблице,
ты увидишь, что она не быстрее Седжвика.



Kazantsev Alexey,

По второй твоей ссылке есть словарь Лопатина http://www.speakrus.ru/dict/lop2v2.zip
Но из него надо выбросить повторы и пояснения к словам.

Из других словарей, по видимому стоит натаскивать функцию только на фамилии.
Вряд ли кому требуются обратные слова и т.п.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380464
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovВряд ли кому требуются обратные слова и т.п.
Там нормальные слова, просто отсортированы с учётом обратного чтения.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380468
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyAleksandr SharahovВряд ли кому требуются обратные слова и т.п.
Там нормальные слова, просто отсортированы с учётом обратного чтения.

Понятно, сначала подумал, что инвертированы)
Ну тогда Лопатина достаточно, наверно. Он больше других (Зализняка, например) и не содержит старых неинтересных слов.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380476
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovSOFT FOR YOU,

Когда ты напишешь функцию с обработкой 4 байта за итерацию,
не порождающую больших кластеров в хеш-таблице,
ты увидишь, что она не быстрее Седжвика.

Ничего не знаю
На реальном примере TFastComparer.GetHashCode всех порвал
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380479
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUНичего не знаю
На реальном примере TFastComparer.GetHashCode всех порвал
Это решение под задачу. Теперь порви на словаре
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380480
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Так тестовые проекты нужны
На чем экспериментировать
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380481
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUAleksandr SharahovSOFT FOR YOU,

Когда ты напишешь функцию с обработкой 4 байта за итерацию,
не порождающую больших кластеров в хеш-таблице,
ты увидишь, что она не быстрее Седжвика.

Ничего не знаю
На реальном примере TFastComparer.GetHashCode всех порвал

Новый Дженкинс, он тоже по 4 байта работает, а все равно медленно.
Не знаешь, почему? )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380482
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТак тестовые проекты нужны
На чем экспериментировать
Ссылки на словари даны, компареры у тебя написаны... Грузи слова в TDictionary, меряй скорость добавления и поиска.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380484
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOUТак тестовые проекты нужны
На чем экспериментировать
Ссылки на словари даны, компареры у тебя написаны... Грузи слова в TDictionary, меряй скорость добавления и поиска.

Мне лень каждый раз повторять то, что уже написано
Если вам западло такие проектики выкладывать, мне тоже западло вносить какие-то оптимизирующие правки
Погоня за минимумом коллизий - это хорошо. Но забывать о производительности хеш-функции слишком глупо
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380490
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUМне лень каждый раз повторять то, что уже написано
Ты хочешь, чтобы я за тебя написал LoadFromFile и загрузку строк в словарь?

SOFT FOR YOUЕсли вам западло такие проектики выкладывать, мне тоже западло вносить какие-то оптимизирующие правки
У тебя уже есть готовый проект для TDictoonary, осталось только другие данные загрузить. У меня бенчи это часть юнит-тестов, поэтому вытягивать код оттуда просто так не получится.

SOFT FOR YOUПогоня за минимумом коллизий - это хорошо. Но забывать о производительности хеш-функции слишком глупо
Какой прок от скорости функции, когда коллизий куча и распределение выглядит как сосредоточение?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380518
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посчитал количество кластеров на очищенном словаре Лопатина (~151 тыс. слов) :

RSHash(UTF16): 28188, десять самых крупных кластеров (61, 54, 54, 49, 47, 47, 46, 46, 45, 45)
SHAPFCT(1251): 28587, десять самых крупных кластеров (42, 42, 41, 41, 40, 39, 39, 37, 37, 36)
Jenkins(UTF16): 28515, десять самых крупных кластеров (55, 51, 50, 50, 48, 44, 43, 41, 40, 40)
FastHash(UTF16): 8266, десять самых крупных кластеров (23804, 15957, 15278, 11214, 8941, 8303, 4138, 3138, 2489, 2177)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380521
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

А файлы тестовые я тебе из задницы достану?
А выгрузку распределения заново писать?
Нахрен нужно )
А прок по скорости я вроде уже показал цифрами
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380526
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUА файлы тестовые я тебе из задницы достану?
Ссылки на словари есть на последних двух страницах. Можешь взять последнюю на Лопатина, там всё готово к употреблению.

SOFT FOR YOUА выгрузку распределения заново писать?
Когда по скорости догонишь Седжвика, тогда я тебе распределение нарисую

SOFT FOR YOUА прок по скорости я вроде уже показал цифрами
Ещё раз: у тебя было решение под конкретную задачу. Сравнивать это с универсальными хешами не серьезно.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380529
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Под какую нахрен конкретную задачу? Есть словарь из разных слов. А твои GUID и нумераторы - это бред, ничего общего не имеющего с реальностью. Гвиды вообще бред сравнивать по строкам. Это 4 инта
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380538
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUПод какую нахрен конкретную задачу? Есть словарь из разных слов. А твои GUID и нумераторы - это бред, ничего общего не имеющего с реальностью. Гвиды вообще бред сравнивать по строкам. Это 4 инта
ОК, нет в твоей реальности строковых guid и слабоменяющихся ключей - дело хозяйское, кто я такой чтобы тебя переубеждать. Я тебе распределение твоего хеша не на гидах показал, а на, вполне себе, "словаре из разных слов". Если хочешь, ещё и скорость померить могу, только тебе результат не понравится.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380546
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Так выложи нормальные тестовые данные, нормальный тестовый проект, с замером времени, генерацией распределения и прочей штукой. А потом будем думать, что с этим делать
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380547
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUKazantsev Alexey,

Так выложи нормальные тестовые данные, нормальный тестовый проект, с замером времени, генерацией распределения и прочей штукой. А потом будем думать, что с этим делать
старая песня - "я не хочу ничего делать, но я считаю, что я прав"
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380550
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТак выложи нормальные тестовые данные, нормальный тестовый проект, с замером времени, генерацией распределения и прочей штукой. А потом будем думать, что с этим делать
Тестовые данные , нормальный тестовый проект . Обгонишь по скорости Седжвика с Дженкинсом, будем рисовать распределение.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380555
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Я ваще-то компаратор написал и хеш, который всех уделывает )
Ты читаешь иногда или твоя миссия разжечь срач? )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380559
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecator,

Я ваще-то компаратор написал и хеш, который всех уделывает )
Ты читаешь иногда или твоя миссия разжечь срач? )
читаю, и не только тебя.
Но Казанцеву я верю гораздо больше
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380567
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Вопрос веры - это не ко мне )
У меня есть область применения и цифры :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380570
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

если интересно, вот еще параметры, дающие неплохие результаты у меня в тестах:

хорошие параметры для ShaPerfectHash
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
  1507220783    -1866451833
  1852789959    -2104246109
  -996848191    -2095857799
   608143717    -1918976345
  1583064417     1853306143
 -1418726097    -1756110961
  1247305377     -614517569
   154873277     1260437083
   272429227     -817013361
   910335899      534943359
  1039183765    -1910953221
 -1544150601    -1013449763
  -563350827      703874843
   286304163      730400999
  1400797483     -321726865
  2134722875    -2043406881
   110780241    -1300254257
  1659010017      965692719
 -1899556311      -37308937
   876016841    -1133541753
  1112155011      541616715
   -83793279     1003072183
 -1776001609    -1612114257
  1154514959     1604042711
  -245981377      672648395
  2013434627     -534159625
  1130133757     -823670353
   244020569     1976849879
  1884505127      -66581213
  -227094231    -1416665393
   946057797    -1946028937
  -834410603      673366943
  1404564999     -115216531
  1136574613    -1851121241
 -1888429349    -1787246127
  -193018651    -1287572049
 -1504179921     2086273999
  -967793697     -695683425



хорошие параметры для ShaStringDictionaryHash
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
 -1240289303     1443687719
  -437836607     1009908695
 -1414797085    -1708766681
  1871049915    -1969104769
  -640839071    -1709030943
  1442961793     -704284605
 -2114244305      600079703
 -1063315811     2133675487
  1235815317      174057607
  -569004607      414008357
  1434321035     -488684657
  -140889857    -1480209985
 -1955453513      814993511
  -857631583     1066602999
 -2121873517    -1725069113
 -1104774847    -1432882041
 -1581522493      825143103
   149848243    -1081285215
 -2008556367    -1332788011
  1762694451     -874798899
  -570407905      425610943
  -147913719     -400822189
   358900827    -2127100245
  1777260377    -1888969341

...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380572
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

забыл добавить, что в каждой группе параметров
первая тройка - без учета фамилий,
а параметры, начиная с 4, подобраны с учетом фамилий
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380579
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecator,

Вопрос веры - это не ко мне )
У меня есть область применения и цифры :)
казанцев убедителен, а ты - нет. Пока что обычный словоблуд
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380596
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к статье прикрепил исходник
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380757
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
исправил найденные баги и опечатки, добавил новые
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380872
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал анимированные гифки показывающие в динамике распределение при заполнении хеш-таблицы с разными хеш-функциями. В качестве ключей использовались слова из орфографического словаря русского языка Лопатина (~151 тыс. слов. ссылка есть на предыдущей странице). Кадры сделаны через каждые 50 вставок в таблицу.

Анимированный гиф, 2Mb. Используется хеш-функция Седжвика. Время заполнения 60 msec.

Анимированный гиф, 1.7Mb. Используется хеш-функция SOFT FOR YOU (FastHash). Время заполнения 2823 msec.

Хотел сделать гифки с поясняющими подписями, чтобы было видно и время и коэффициент заполненности в моменты расширения таблицы, но такие гифы плохо оптимизируются и весят под 70Mb.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380873
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

С параметрами поэкспериментирую, как придумаю, как это дело автоматизировать :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380875
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Анимированный гиф, 1.7Mb. Используется хеш-функция SOFT FOR YOU (FastHash). Время заполнения 2823 msec.
Треш и угар.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380886
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyВремя заполнения 60 msec.

Что так долго? )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380898
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovЧто так долго? )
Разве долго? TDictionary - 131 msec. У меня Phenom II 3GHz + дельфя на виртуалке.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380900
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyAleksandr SharahovЧто так долго? )
Разве долго? TDictionary - 131 msec. У меня Phenom II 3GHz + дельфя на виртуалке.

Мою поделку попробуй )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380914
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovМою поделку попробуй )
Напрямую не получится. У тебя ключи - байтовые строки, у меня - юникод. У тебя таблица хранит объекты, у меня собственный тип размером 16 байт. К тому же моя таблица поддерживает индексный доступ. Но я всё же померял. Ключи твоей таблице отдал в utf8, у себя изменил внутренний тип данных. В результате паритет - ~30/~37 msec.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380921
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyAleksandr SharahovМою поделку попробуй )
Напрямую не получится. У тебя ключи - байтовые строки, у меня - юникод. У тебя таблица хранит объекты, у меня собственный тип размером 16 байт. К тому же моя таблица поддерживает индексный доступ. Но я всё же померял. Ключи твоей таблице отдал в utf8, у себя изменил внутренний тип данных. В результате паритет - ~30/~37 msec.

Где-то еще тормоза добавил, но скрываешь)
Чисто загрузка слов, сидящих в памяти, у меня в 2 с лишним раза быстрее.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380929
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovГде-то еще тормоза добавил, но скрываешь)
Наоборот, даже ключи предварительно подготавливаю, чтоб не конвертировать в момент вставки.
Aleksandr SharahovЧисто загрузка слов, сидящих в памяти, у меня в 2 с лишним раза быстрее.
Железо какое?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380930
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyAleksandr SharahovГде-то еще тормоза добавил, но скрываешь)
Наоборот, даже ключи предварительно подготавливаю, чтоб не конвертировать в момент вставки.
Aleksandr SharahovЧисто загрузка слов, сидящих в памяти, у меня в 2 с лишним раза быстрее.
Железо какое?

i5-3470 3.2GHz 4Gb
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380936
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahovi5-3470 3.2GHz 4Gb
Чему тогда удивляться :) Где Phenom II и где i5. Дельфийский TDictonary за сколько заполняется?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380937
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Странно, неужели так длина ключа влияет?
Попробуй на юникод переделать или через байт ключ обрабатывать.
Интересно, на сколько ускорится.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380941
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyAleksandr Sharahovi5-3470 3.2GHz 4Gb
Чему тогда удивляться :) Где Phenom II и где i5. Дельфийский TDictonary за сколько заполняется?

Дык все равно что-то очень уж.
Я на Delphi7. TDictionary не юзаю. Свои таблицы, типа твоей.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380954
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Еще как вариант: т.к. вычисляется другое значение ключа,
соответственно работа с памятью в другой последовательности.
Но должно же усредняться, блин.

Остается проц.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380958
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Переделал твою таблицу на юникод (RawByteString = UnicodeString ). Поменял дефолтный хеш на ShaPerfectHash (был ShaPerfectHashAsm). У своей таблицы также поменял хеш на твой и вернул свой тип данных. Перед замером установил вместимость таблиц (на первом замере не устанавливал, и это может объяснять почему моя на первом замере была чуть медленне. у меня, по дефолту, при расширении таблицы используется реаллок, а не перевыделение памяти).

Твоя: вставка - 35, поиск всех ключей (1000 итераций) - 21136.
Моя: вставка - 34, поиск всех ключей (1000 итераций) - 21952.

Паритет ;) Хотя я удивлён, т.к. на вставке у меня 16 байт, вместо 4 у тебя.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380959
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovОстается проц.
Скорее всего так и есть. Я первый вариант свой таблицы писал и отлаживал на AMD, потом проверил на древнем Pentium Mobile и за голову схватился - моя работала медленне дельфийского TDictionary (хотя на AMD была сильно быстрее).
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380970
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyТвоя: вставка - 35, поиск всех ключей (1000 итераций) - 21136.
Моя: вставка - 34, поиск всех ключей (1000 итераций) - 21952.
Ой. Твоя - моя перепутал.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380978
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyKazantsev AlexeyТвоя: вставка - 35, поиск всех ключей (1000 итераций) - 21136.
Моя: вставка - 34, поиск всех ключей (1000 итераций) - 21952.
Ой. Твоя - моя перепутал.

Думаю, если код из FindCodeName перетащить в FindName, разницы вообще не будет.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380984
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас ещё сделал чтобы твоя таблица хранила не объекты, а мой тип данных (16 байт). И проверил всё не на виртуальной машине. Три замера, лучшие результаты:
Твоя: вставка - 33, поиск всех ключей (1000 итераций) - 21316.
Моя: вставка - 33, поиск всех ключей (1000 итераций) - 18707.
У меня лучший результат на поиске по причине другой организации данных в таблице (для снижения расхода памяти, из-за размера хранимых значений + индексного доступа). В общем, если привести структуру ко классической таблице, то и по поиску будет паритет.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39380996
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ох ты какой интересный топик, жалко времени нет
murmur3 очень интересно как пашет
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381018
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)murmur3 очень интересно как пашет
Вставка - 41, Поиск всех ключей (1000 итераций) - 23319

Распределение:
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381027
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

а на чём тестил?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381028
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

компилятор и проц имею ввиду
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381031
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)компилятор и проц имею ввиду
Delphi XE2, Phenom II X4 940 3GHz.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381046
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

неплохо, думал хуже будет
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381055
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если говорить об универсальном хеше, то он должен быть байтовый, а не юникодный. Как стандартный Джеткинс

Kazantsev Alexey,

Твой генератор распределений где выложен?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381075
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЕсли говорить об универсальном хеше, то он должен быть байтовый, а не юникодный. Как стандартный Джеткинс
Меняем UnicodeString на RawByteString и юникодный Седжвик превращается в байтовый. Меняем RawByteString на UnicodeString и байтовый хеш Шарахова превращается в юникодный. Причём, что в одном, что в другом случае, без потери эффективности.

SOFT FOR YOUТвой генератор распределений где выложен?
Нигде не выложен. Чего там выкладывать-то? Банальное расставление пикселей в соответствии с признаком занятой ячейки таблицы.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381092
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOUТак выложи нормальные тестовые данные, нормальный тестовый проект, с замером времени, генерацией распределения и прочей штукой. А потом будем думать, что с этим делать
Тестовые данные , нормальный тестовый проект . Обгонишь по скорости Седжвика с Дженкинсом, будем рисовать распределение.

Вот что ты за человек такой?
Даже приведённый тобой вариант на x86 выдаёт такой результат:

Код: plaintext
1.
2.
3.
4.
TSedgwicComparer... 827мс
TShaPerfectComparer... 827мс
TFastComparer... 749мс

Press Enter

Я думал, я зайду, скачаю, а там подсчёт коллизий, замер времени, разные тестовые базы, генерация GIF-а распределения
Сейчас адаптирую хеш под UTF-16, выложу
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381097
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUДаже приведённый тобой вариант на x86 выдаёт такой результат:

Код: plaintext
1.
2.
3.
4.
TSedgwicComparer... 827мс
TShaPerfectComparer... 827мс
TFastComparer... 749мс

Press Enter

А какой результат он должен выдавать?

SOFT FOR YOUЯ думал, я зайду, скачаю, а там подсчёт коллизий, замер времени, разные тестовые базы, генерация GIF-а распределения
Ты меня с дедом морозом не путаешь?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381098
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Просто я искренне не понимаю, зачем эти тонны пространных рассуждений, если можно взять конкретный пример и экспериментировать с ним. Вот по кой фиг нужны были эти изобретения хешей, если на реальном примере мой хеш уже выдаёт лучший результат? Ладно бы вы придумывали что-то что быстрее, или с одинаковой скоростью, но лучшим распределением. Тогда был бы смысл
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381101
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последние результаты такие

x86:
Код: plaintext
1.
2.
TSedgwicComparer... 936мс
TShaPerfectComparer... 920мс
TFastComparer... 795мс

x64:
Код: plaintext
1.
2.
TSedgwicComparer... 1357мс
TShaPerfectComparer... 1420мс
TFastComparer... 1217мс

Проект (Рядом должен лежать "StringBase.txt")
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
program SpeedTest;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Winapi.Windows,
  System.Generics.Defaults,
  System.Generics.Collections,
  System.SysUtils,
  System.Classes;

type
  TStringEqualComparer = class(TInterfacedObject)
    function Equals(const Left, Right: string): Boolean; reintroduce;
    // важно! если сделать виртуальный метод - то скорость падает ~3 раза
    // function GetHashCode(const Value: string): Integer; reintroduce; virtual; abstract;
  end;
  TComparerClass = class of TStringEqualComparer;

  TSedgwicComparer = class(TStringEqualComparer, IEqualityComparer<string>)
    function GetHashCode(const Value: string): Integer; reintroduce;
  end;

  TShaPerfectComparer = class(TStringEqualComparer, IEqualityComparer<string>)
    function GetHashCode(const Value: string): Integer; reintroduce;
  end;

  TFastComparer = class(TStringEqualComparer, IEqualityComparer<string>)
    function GetHashCode(const Value: string): Integer; reintroduce;
  end;

{ TStringEqualComparer }

function TStringEqualComparer.Equals(const Left, Right: string): Boolean;
label
  cmp_ptrs;
var
  i, Count: NativeInt;
  S1, S2: PNativeUInt;
begin
  S1 := Pointer(Left);
  S2 := Pointer(Right);
  if (S1 <> S2) and (S1 <> nil) and (S2 <> nil) then
  begin
    Dec(NativeUInt(S1), SizeOf(Integer));
    Dec(NativeUInt(S2), SizeOf(Integer));
    Count := PInteger(S1)^;
    if (Integer(Count) <> PInteger(S2)^) then goto cmp_ptrs;
    Inc(NativeUInt(S1), SizeOf(Integer));
    Inc(NativeUInt(S2), SizeOf(Integer));

    for i := 1 to Count shr {$if SizeOf(NativeUInt) = 8}2{$else}1{$endif} do
    begin
      if (S1^ <> S2^) then goto cmp_ptrs;
      Inc(S1);
      Inc(S2);
    end;

    {$if SizeOf(NativeUInt) = 8}
    if (Count and 2 <> 0) then
    begin
      if (PCardinal(S1)^ <> PCardinal(S2)^) then goto cmp_ptrs;
      Inc(NativeUInt(S1), SizeOf(Cardinal));
      Inc(NativeUInt(S2), SizeOf(Cardinal));
    end;
    {$endif}

    if (PWord(S1)^ <> PWord(S2)^) then goto cmp_ptrs;
    Result := True;
    Exit;
  end else
  begin
  cmp_ptrs:
    Result := (S1 = S2);
  end;
end;

{ TSedgwicComparer }

function TSedgwicComparer.GetHashCode(const Value: string): Integer;
var
  a, i: Integer;
begin
  Result := 0;
  a := 63689;
  for i := 0 to Length(Value) - 1 do
  begin
    Result := Result * a + PWordArray(Value)[i];
    a := a * 378551;
  end;
end;

{ TShaPerfectComparer }

function TShaPerfectComparer.GetHashCode(const Value: string): Integer;
var
  i, j: integer;
begin;
  Result:=0;
  for i:=0 to Length(Value)-1 do begin;
    j:=ord(Value[i+1]);
    Result:=Result * 1041204193 + (j+1507220783);
    end;
  Result:=Result * -1866451833;
end;

{ TFastComparer }

function TFastComparer.GetHashCode(const Value: string): Integer;
var
  i, X, Count: Integer;
  S: PByte;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Count := PInteger(NativeInt(Value) - 4)^;

    Result := Count;
    for i := 1 to (Count shr 1) do
    begin
      X := Result xor PInteger(S)^;
      Result := Result * i;
      Inc(Result, X shr 16);
      Inc(S, SizeOf(Integer));
      Inc(Result, X);
    end;

    Inc(Result, Ord(PChar(S)^));
    Result := Result * -1866451833;
  end;
end;


const
  ITERATIONS_COUNT = 100;
  COMPARERS: array[0..2] of TComparerClass = (TSedgwicComparer, TShaPerfectComparer, TFastComparer);

var
  i, c, k: NativeInt;
  VALUES: TArray<string>;
  List: TStringList;
  Time: Cardinal;
  Comparer: IEqualityComparer<string>;
  Dictionary: TDictionary<string, Integer>;

begin
  try
    // загрузка значений
    List := TStringList.Create;
    try
      List.LoadFromFile('StringBase.txt');
      SetLength(VALUES, List.Count);

      for i := 0 to List.Count - 1 do
      begin
        VALUES[i] := List[i];
      end;
    finally
      List.Free;
    end;

    // цикл по всем компарерам
    for c := Low(COMPARERS) to High(COMPARERS) do
    begin
      // компарер, конструктор
      Write(COMPARERS[c].ClassName, '...');
      case c of
        0: Comparer := TSedgwicComparer.Create;
        1: Comparer := TShaPerfectComparer.Create;
      else
        // 2:
        Comparer := TFastComparer.Create;
       end;
      Dictionary := TDictionary<string, Integer>.Create(Length(VALUES), Comparer);

      try
        // заполняем
        for k := Low(VALUES) to High(VALUES) do
          Dictionary.Add(VALUES[k], 0);

        // тестируем
        Time := GetTickCount;
        for i := 1 to ITERATIONS_COUNT do
        for k := Low(VALUES) to High(VALUES) do
        begin
          Dictionary.Items[VALUES[k]];
        end;
        Time := GetTickCount - Time;
        Writeln(' ', Time, 'мс');

      finally
        Comparer := nil;
        Dictionary.Free;
      end;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

  // нажать Enter
  Writeln;
  Write('Press Enter');
  Readln;
end.

...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381105
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Гы:

TSedgwicComparer... 1750мс
TShaPerfectComparer... 1750мс
TFastComparer... 1937мс

Press Enter

:)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381107
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, еще надо сделать так:
Код: pascal
1.
List.LoadFromFile('StringBase.txt',TEncoding.UTF8);



TSedgwicComparer... 1312мс
TShaPerfectComparer... 1328мс
TFastComparer... 1422мс

Press Enter
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381110
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUПросто я искренне не понимаю, зачем эти тонны пространных рассуждений, если можно взять конкретный пример и экспериментировать с ним. Вот по кой фиг нужны были эти изобретения хешей, если на реальном примере мой хеш уже выдаёт лучший результат?
Точно! Давайте возьмём конкретный пример и... загрузим в него словарь Лопатина . Но тестировать будем только с одной итерацией, во избежание.
Результат...Default... 32мс
TSedgwicComparer... 15мс
TSimpleComparer... 46203мс
TShiftComparer... 42922мс
TFastComparer... 1391мс

Press Enter
Вот этим и отличается "решение под задачу" от универсального хеша.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381121
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Шарахов использует строки, а не произвольные байты, ты вообще настаиваешь на Unicode
Где тут универсальность?
На лицо "решение под задачу"

Собственно, словарь Лопатина - тоже весьма специфичная штука. Множество коротких похожих слов

В универсале Седжвик неплох, на мой взгляд лучше Дженкинса
Но для простых задач, типа сериализации или идентификации лексем, лучше конечно упрощать функции
Если нет возможности кодогенерить
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381125
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немного переделал ваш тест
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
program HashTest;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Winapi.Windows,
  System.SysUtils,
  System.Classes,
  System.Generics.Collections,
  System.Generics.Defaults;

type
  TStringEqualComparer = class(TInterfacedObject)
    function Equals(const Left, Right: string): Boolean; reintroduce;
    // важно! если сделать виртуальный метод - то скорость падает ~3 раза
    // function GetHashCode(const Value: string): Integer; reintroduce; virtual; abstract;
  end;

  TSedgwicComparer = class(TStringEqualComparer, IEqualityComparer<string>)
    function GetHashCode(const Value: string): Integer; reintroduce;
  end;

  TSimpleComparer = class(TStringEqualComparer, IEqualityComparer<string>)
    function GetHashCode(const Value: string): Integer; reintroduce;
  end;

  TShiftComparer = class(TStringEqualComparer, IEqualityComparer<string>)
    function GetHashCode(const Value: string): Integer; reintroduce;
  end;

  TFastComparer = class(TStringEqualComparer, IEqualityComparer<string>)
    function GetHashCode(const Value: string): Integer; reintroduce;
  end;

  TMurmur3Comparer = class(TStringEqualComparer, IEqualityComparer<string>)
    function GetHashCode(const Value: string): Integer; reintroduce;
  end;

{ TStringEqualComparer }

function TStringEqualComparer.Equals(const Left, Right: string): Boolean;
label
  cmp_ptrs;
var
  i, Count: NativeInt;
  S1, S2: PNativeUInt;
begin
  S1 := Pointer(Left);
  S2 := Pointer(Right);
  if (S1 <> S2) and (S1 <> nil) and (S2 <> nil) then
  begin
    Dec(NativeUInt(S1), SizeOf(Integer));
    Dec(NativeUInt(S2), SizeOf(Integer));
    Count := PInteger(S1)^;
    if (Integer(Count) <> PInteger(S2)^) then goto cmp_ptrs;
    Inc(NativeUInt(S1), SizeOf(Integer));
    Inc(NativeUInt(S2), SizeOf(Integer));

    for i := 1 to Count shr {$ifdef CPUX64}2{$else}1{$endif} do
    begin
      if (S1^ <> S2^) then goto cmp_ptrs;
      Inc(S1);
      Inc(S2);
    end;

    {$ifdef CPUX64}
    if (Count and 2 <> 0) then
    begin
      if (PCardinal(S1)^ <> PCardinal(S2)^) then goto cmp_ptrs;
      Inc(NativeUInt(S1), SizeOf(Cardinal));
      Inc(NativeUInt(S2), SizeOf(Cardinal));
    end;
    {$endif}

    if (PWord(S1)^ <> PWord(S2)^) then goto cmp_ptrs;
    Result := True;
    Exit;
  end else
  begin
  cmp_ptrs:
    Result := (S1 = S2);
  end;
end;

{ TSedgwicComparer }

function TSedgwicComparer.GetHashCode(const Value: string): Integer;
var
  a, i: Integer;
begin
  Result := 0;
  a := 63689;
  for i := 1 to Length(Value) - 1 do
  begin
    Result := Result * a + PWordArray(Value)[i];
    a := a * 378551;
  end;
end;

{ TSimpleComparer }

function TSimpleComparer.GetHashCode(const Value: string): Integer;
var
  i: NativeInt;
  S: PChar;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Result := PInteger(NativeInt(Value) - 4)^;

    for i := 0 to NativeInt(Result) - 1 do
    begin
      Result := Result + Ord(S[i]);
    end;
  end;
end;

{ TShiftComparer }

function TShiftComparer.GetHashCode(const Value: string): Integer;
var
  i: NativeInt;
  S: PChar;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Result := PInteger(NativeInt(Value) - 4)^;

    for i := 0 to NativeInt(Result) - 1 do
    begin
      Result := Result xor (Result shr (i and 7 + 1)) + Ord(S[i]);
    end;
  end;
end;

{ TFastComparer }

function TFastComparer.GetHashCode(const Value: string): Integer;
var
  i, X, Count: Integer;
  S: PByte;
begin
  S := Pointer(Value);
  Result := 0;
  if (S <> nil) then
  begin
    Count := PInteger(NativeInt(Value) - 4)^;

    Result := Count;
    for i := 1 to (Count shr (SizeOf(Char) xor 3)) do
    begin
      X := Result xor PInteger(S)^;
      Result := Result * i;
      Inc(Result, X shr 19);
      Inc(S, SizeOf(Integer));
      Inc(Result, X);
    end;

    for i := 1 to (Count and ((SizeOf(Char) xor 2) or 1)) do
    begin
      Result := Result * i;
      Inc(Result, Ord(PChar(S)^));
      Inc(S, SizeOf(Char));
    end;
  end;
end;

{ TMurmur3Comparer }

type
  uint32_t = cardinal;
{$IFNDEF fpc}
function RolDWord(x:uint32_t;r:integer):uint32_t;
{$IF Defined(CPUX86)}
asm
  MOV  CL, DL
  ROL  EAX, CL
end;
{$ELSEIF Defined(CPUX64)}
asm
  MOV  EAX, ECX
  MOV  CL, DL
  ROL  EAX, CL
end;
{$ELSE}
begin
  Result:=(x shl r) or (x shr (32 - r));
end;
{$IFEND}
{$ENDIF}

function MurmurHash3_x86_32 ( const Akey; len:uint32_t): cardinal;
type
  Puint32_t=^uint32_t;

var data:Puint32_t;
  nblocks,tail_len,i:uint32_t;
  h1,k1:uint32_t;
const
   c1:uint32_t = $cc9e2d51;
   c2:uint32_t = $1b873593;
type
 TTailRec=packed record
  case Integer of
   1:(b:byte);
   2:(w:word);
   3:(uint24_d:uint32_t);
 end;
var
 tail:^TTailRec;
begin
  data := @Akey;
  nblocks := len div 4;

  h1 := 0;
  //----------
  // body
  for i:=1 to nblocks do begin
    k1 := data^;

    k1 := k1 * c1;
    k1 := RolDWord(k1,15);
    k1 := k1*c2;

    h1 := h1 xor k1;
    h1 := RolDWord(h1,13);
    h1 := h1*5+$e6546b64;

    inc(data);
  end;

  //----------
  // tail

  tail :=pointer(data);

  k1 := 0;
  tail_len:=len and 3;
  if tail_len>0 then begin
    case tail_len of
    3: k1 :=k1 xor (tail^.uint24_d and $FFFFFF);
    2: k1 :=k1 xor tail^.w;
    1: k1 :=k1 xor tail^.b;
    end;

    k1 :=k1* c1;
    k1 := RolDWord(k1,15);
    k1 :=k1 * c2;
    h1 :=h1 xor k1;
  end;
  //----------
  // finalization

  h1 :=h1 xor len;

  //h1 := fmix32(h1);  Result := h1;

  h1 :=h1 xor (h1 shr 16);
  h1 :=h1* $85ebca6b;
  h1 :=h1 xor (h1 shr 13);
  h1 :=h1 * $c2b2ae35;

  Result:=h1 xor (h1 shr 16);
end;
function TMurmur3Comparer.GetHashCode(const Value: string): Integer;
begin
  Result := Integer(MurmurHash3_x86_32(PChar(Value)^, Length(Value) * SizeOf(Char)));
end;



procedure TestDict(Title: string; L: TStringList; C: IEqualityComparer<string> = nil);
var
  t1, t2: Cardinal;
  D: TDictionary<string, Integer>;
  i: Integer;
begin
  Write(Title);
  //
  D := TDictionary<string, Integer>.Create(L.Count, C);
  try
   t1 := GetTickCount();
    for i := L.Count - 1 downto 0 do
      D.AddOrSetValue(L[i], i);

    t2 := GetTickCount();
    Writeln(t2 - t1);
  finally
    D.Free;
  end;
  //
end;

function GenStr(): string;
var
  l: Integer;
begin
  l := Random(1024);
  SetLength(Result, l);
  for l := l downto 1 do
  begin
    Result[l] := Char(Random(256));
  end;
end;

procedure GenList(L: TStringList);
var
  i: Integer;
begin
  RandSeed := 0;
  for i := 1 to 1000000 do
    L.Add(GenStr)
end;

var
  L: TStringList;

begin
  try
    L:= TStringList.Create;
    try
      GenList(L);
      TestDict( 'std: ', L);

      TestDict( 'TSedgwicComparer: ', L, TSedgwicComparer.Create);
      TestDict( 'TMurmur3Comparer: ', L, TMurmur3Comparer.Create);
      TestDict( 'TFastComparer: ', L, TFastComparer.Create);
      TestDict( 'TShiftComparer: ', L, TShiftComparer.Create);
      TestDict( 'TSimpleComparer: ', L, TSimpleComparer.Create);
    finally
      L.Free;
    end;
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.


[quote автор]
Delphi XE2, intel i7 4710hq
Код: plaintext
1.
2.
3.
4.
5.
G:\Binaries>HashTest.exe
std: 4031
TSedgwicComparer: 984
TMurmur3Comparer: 1062
TFastComparer: 750
последних двух я не дождался
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381136
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUШарахов использует строки, а не произвольные байты, ты вообще настаиваешь на Unicode
Где тут универсальность?
Чудак-человек... Универсальность в алгоритме, а не в принимаемом параметре. Я же тебе говорил, что замена байтовой строки на юникод строку не влияет на эффективность этих хешей. И чем байтовая строка отличается от произвольных байтов? Думаешь распределение хуже будет? Не будет. Я тут для прикола засовывал сырые гиды в 8-символьные юникодовые строки без преобразования - всё прекрасно работает. Так что тут подвоха не ищи.

SOFT FOR YOUСобственно, словарь Лопатина - тоже весьма специфичная штука. Множество коротких похожих слов
Ну вот, опять гранаты не той системы... А я тебе говорил, что слабо меняющиеся ключи (последовательные, как частный случай) это одна из проблем для хешей. Кстати, словарь Лопатина это ещё что, ты на словаре Российских фамилий проверь...

SOFT FOR YOUВ универсале Седжвик неплох, на мой взгляд лучше Дженкинса
Но для простых задач, типа сериализации или идентификации лексем, лучше конечно упрощать функции
Если нет возможности кодогенерить
Давно известно, что под задачу можно родить самый быстрый хеш. Поэтому таблицы и имеют возможность заменить хеш-функцию.

Кстати, я проверил очередную мутацию твоего хеша . На словаре Лопатина небольшое отставание от Седжвика. На словаре Российских фамилий уже двукратное отставание. На последовательных ключах полный провал - отставание на порядок. Прикладываю распределение на фамилиях.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381150
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyЯ же тебе говорил, что замена байтовой строки на юникод строку не влияет на эффективность этих хешей.

Байтовая универсальная функция отличается от юникодовой тем, что выполняется в 2 раза медленнее

Kazantsev AlexeyИ чем байтовая строка отличается от произвольных байтов? Думаешь распределение хуже будет? Не будет.

Ты прикалываешься?
В русском алфавите 33 буквы. А ходовых вообще штук 10-15

Kazantsev AlexeyКстати, я проверил очередную мутацию твоего хеша. На словаре Лопатина небольшое отставание от Седжвика.

А ты на какой хеш-таблице тестировал?
Собственного приготовления?

Kazantsev AlexeyА я тебе говорил, что слабо меняющиеся ключи (последовательные, как частный случай) это одна из проблем для хешей.

Мы же вроде уже решили, что для универсального случая Седжвик заруливает
Однако универсальных случаев почти нет. И для обычных случаев, как например список HTML-тегов, имеет смысл существенно упростить функцию

P.S. Судя по всему, здесь ещё сильно зависит от реализации хеш-таблицы.
Дубликация хеша - это по сути 1-2 лишних сравнения, несколько тактов, которые должны быть сэкономлены на простых хеш-функциях
Надо так же сказать, что в моей давнишней реализации (x86), сохранялось и предварительно сравнивалось значение функции (не обрезанное), а структуры менеджелись специальными пулами
Это я к тому, что можно померяться ещё реализациями хеш-таблиц )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381152
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТы прикалываешься?
В русском алфавите 33 буквы. А ходовых вообще штук 10-15Да-да. Именно для этого случая Седжвик и тюнил свой алгоритм. Тебе же Казанцев написал, что и на сырых бинарных, даёт нормальное распределение. В этом и есть универсальность при отличном быстродействии. В отличии от твоего
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381154
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUБайтовая универсальная функция отличается от юникодовой тем, что выполняется в 2 раза медленнее
Зависит от реализации. Но для сравнения скорости использовались функции с одинаковым типом параметра, или я отдельно указывал что тип ключа отличается (кроме случая с мурмур3, там на вход подавались байты юникодовой строки). Но о скорости хеша нужно беспокоиться только тогда, когда будет получено хорошее распределение, иначе весь пар уйдёт в свисток компарера.

SOFT FOR YOUТы прикалываешься?
В русском алфавите 33 буквы. А ходовых вообще штук 10-15
А в английском ещё меньше, и что? Функции с хорошим лавинным эффектом это не мешает.

SOFT FOR YOUА ты на какой хеш-таблице тестировал?
Собственного приготовления?
Разумеется. Хотя, ты можешь сам проверить на своём примере с TDictionary.

SOFT FOR YOUОднако универсальных случаев почти нет. И для обычных случаев, как например список HTML-тегов, имеет смысл существенно упростить функцию
Ну вот Свириденков писал , что у него набор тегов может расширяться в процессе парсинга. А теги в XML, они и на русском могут быть (кстати, какая-то из наших гос.контор такие XML'ки использует), вот уже и требуется универсальное решение.

SOFT FOR YOU P.S. Судя по всему, здесь ещё сильно зависит от реализации хеш-таблицы.
Таблицы которые здесь сравнивали, все являются классическими таблицами с открытой адресацией и линейным пробированием. Реализации отличаются, разумеется, но генеральный алгоритм один.

SOFT FOR YOUДубликация хеша - это по сути 1-2 лишних сравнения, несколько тактов, которые должны быть сэкономлены на простых хеш-функциях
Нет, коллизия хеша это гарантированный поход к компареру за сравнением ключа.

SOFT FOR YOUНадо так же сказать, что в моей давнишней реализации (x86), сохранялось и предварительно сравнивалось значение функции (не обрезанное), а структуры менеджелись специальными пулами
Это я к тому, что можно померяться ещё реализациями хеш-таблиц )
Ну... Вэлкам!
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381168
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Седжвик. Распределение на строковых GUID:
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381169
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Седжвик. Распределение на "сырых" GUID:
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381210
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

я не совсем понял, в TFastComparerPure.GetHashCode ошибка?
или так задумано, что она берёт хеш только от половины строки?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381216
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пардон, не разобрал с наскоку
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381238
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Байтовые хеши медленнне в 2 раза уникодных потому, что обрабатывают в 2 раза меньше байт за итерацию. Посмотри стандартный хеш строк. Длина умножается на 2, что вроде как естественно и лежит на поверхности )

Хватит приставать со своими коллизиями. И распределениями.
Дженкинс даёт отличное распределение, но из-за сложности функции, он даёт проседание производительности
Важны 4 составляющие: и реализация таблицы, и коллизии, и скорость функции, и скорость компаратора. А не только распределение

Что касается меряние таблицами - жду твой код в общем примере. Ибо мне свою выдирать из библиотеки долго, а количество твоего кода в ветке удручающе маленькое. 0 если не ошибаюсь
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381303
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUБайтовые хеши медленнне в 2 раза уникодных потому, что обрабатывают в 2 раза меньше байт за итерацию. Посмотри стандартный хеш строк. Длина умножается на 2, что вроде как естественно и лежит на поверхности )
Это и так ясно, только не о том ты думаешь.

SOFT FOR YOUХватит приставать со своими коллизиями. И распределениями.
Коллизии не мои, они у твоего хеша. А чем больше коллизий, тем медленне работает таблица.

SOFT FOR YOUДженкинс даёт отличное распределение, но из-за сложности функции, он даёт проседание производительности
Важны 4 составляющие: и реализация таблицы, и коллизии, и скорость функции, и скорость компаратора. А не только распределение
Всё верно. Только медленный Дженкинс уделывает твой быстрый хеш.

SOFT FOR YOUЧто касается меряние таблицами - жду твой код в общем примере. Ибо мне свою выдирать из библиотеки долго, а количество твоего кода в ветке удручающе маленькое. 0 если не ошибаюсь
Есть встречное предложение, бери TDictionary.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381349
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Я подбираю решение под задачу. На тегах мои хеши уделывают Седжвика. А стандартный компаратор (с Дженкинсом) - уделывает в разы.

Об чем спор то вообще? Что Седжвик в принципе хорош? Так с этим никто не спорит. Но как показала практика, простые хеши вполне могут давать ощутимый прирост. Особенно на длинных и/или разнородных строках.

Я думал, тебя академическая сторона вопроса интересует. Итоговая производительность, приемлемое распределение.
А ты споришь только ради спора. Заняться нечем что ли?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381369
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЯ подбираю решение под задачу.
Это ты правильно сейчас говоришь, а раньше утверждал, что твой хеш быстр и удобен вообще для всего .
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381383
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Таки может потому, что в обычной жизни людям не приходит в голову тестировать словарь Лопатина или последовательные числа?

В обычной жизни люди делают сериализацию или поиск токенов. И в таких случаях как раз умельцы наворачивают что-то типа Дженкинса. Только потому, что на Лопатине он даёт меньше коллизий )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381385
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Ты же тоже прочитал про размер таблицы простым числом. А как предложили замерить производительность - ты сразу "не, давайте без меня"
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381398
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТаки может потому, что в обычной жизни людям не приходит в голову тестировать словарь Лопатина или последовательные числа?
Хеши "подходящие вообще для всего" и тестировать нужно на всём. Сюрприз.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381407
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

А где автор топика или кто угодно кроме тебя говорил о хешах, подходящих для всего?
Хеши используются в особых ситуациях. И если не хочется париться над производительностью в этих ситуациях - берётся стандартные TDictionary с дефолтным хеш-компаратором
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381411
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТы же тоже прочитал про размер таблицы простым числом. А как предложили замерить производительность - ты сразу "не, давайте без меня"
Ты сейчас о чём вообще? У меня таблица имеет два режима работы: когда внутренний размер кратен степени двойки, и когда не кратен. Второй режим сделан для того, чтобы снизить расход памяти ценой некоторого снижения производительности. Обычное компромиссное решение. Раз в статье Шарахова описывалась таблица с кратным степени двойки и указанным размером, то и я свою тестировал в этих условиях. В чём проблема?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381416
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUА где автор топика или кто угодно кроме тебя говорил о хешах, подходящих для всего?
Да ты же о них и говорил
SOFT FOR YOUВот такая функция будет быстра и удобна вообще для всего )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381419
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

О том, что для снижения количества коллизий, размер таблицы должен быть простым числом
И многие умельцы так и делают
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381423
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Там же чёрным по белому написано:
"В большинстве случаев хватит этого"

Про словарь Лопатина или последовательные числа - там не написано
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381425
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUKazantsev Alexey,

Там же чёрным по белому написано:
"В большинстве случаев хватит этого"

Про словарь Лопатина или последовательные числа - там не написано
словарь Лопатина вполне себе подходит под "большинство случаев"
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381431
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

И часто ты видишь 150к уникальных токенов? На русском языке )))
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381434
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUО том, что для снижения количества коллизий, размер таблицы должен быть простым числом
И многие умельцы так и делают
Да фиолетово это, когда коллизии на хеше.

SOFT FOR YOUТам же чёрным по белому написано:
"В большинстве случаев хватит этого"
Вертишься, как уж на сковороде. Про большинство случаев это у тебя для первой функции написано. А для второй написано "Вот такая функция будет быстра и удобна вообще для всего )".

SOFT FOR YOUПро словарь Лопатина или последовательные числа - там не написано
Под определение "вообще для всего" подходит вообще все. Офигеть, правда?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381443
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

А чего вертеться? Для тегов у меня быстрее.
Для Лопатина тоже.

Да, первые варианты оставляли желать лучшего. Но основная идея мессейджа была в том, чтобы обратить внимание на излишнюю зацикленность на коллизиях. Когда сложность хеша существенно превосходит затрат на обработку коллизий.

Я, знаешь ли, с Лопатиными не работаю. А когда появится такая необходимость, придумаю что-то ещё.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381449
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUЯ, знаешь ли, с Лопатиными не работаю. А когда появится такая необходимость, придумаю что-то ещё.
да, захардкодь его
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381454
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Думаешь, не получится?
Утилита есть, исходники открыты, дерзай!
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381456
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecator,

Думаешь, не получится?
Утилита есть, исходники открыты, дерзай!
мне не надо, ты грозился
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381459
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUА чего вертеться? Для тегов у меня быстрее.
Для Лопатина тоже.
Что, твой быстрый хеш снова мутировал? Ещё вчера на Лопатине он отставал. Теперь, как я полагаю, на очереди словарь Российских фамилий? Хотя о чём это я, кому они нафиг нужны, у людей же только токены да сериализация

SOFT FOR YOUНо основная идея мессейджа была в том, чтобы обратить внимание на излишнюю зацикленность на коллизиях. Когда сложность хеша существенно превосходит затрат на обработку коллизий.
Мессейдж твой о том, что под задачу можно найти самое быстрое решение (и то не факт, что именно под эту оно самое-самое. Набор тегов-то не статичен, по условию). Открыл Америку, что называется.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381462
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Заплати мне за хардкоддинг Лопатина - я сделаю
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381464
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecator,

Заплати мне за хардкоддинг Лопатина - я сделаю
ты не вертись, и на меня не переводи, твои слова были другие:
SOFT FOR YOUс Лопатиными не работаю. А когда появится такая необходимость, придумаю что-то ещё.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381465
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Хрена ли они отставали?
Исходники выложены, замер времени произведён. Фамилии не смотрел. Да и зачем?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381469
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Необходимости нет. Там же написано про необходимость
Я теле дал возможность эту необходимость сгенерить
А ты как всегда сливаешься
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381471
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecator,

Необходимости нет. Там же написано про необходимость
Я теле дал возможность эту необходимость сгенерить
А ты как всегда сливаешься
покажи, где я конкретно написал про то, что мне нужен этот словарь ?
мне кажется, что ты закусил удила
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381475
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUХрена ли они отставали?
Я у себя мерял - отставал твой хеш на Лопатине. И не только у меня .

SOFT FOR YOUФамилии не смотрел. Да и зачем?
Да и правильно, сложно даже представить, кому это они могут понадобиться.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381477
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Какое мне дело, нужен он тебе или нет?
У меня необходимости нет
Я дал тебе возможность эту необходимость сгенерить
Или сгенерировать код самостоятельно, открыв исходники и бинарники утилиты
Мне глубоко плевать, что там тебе нужно или нет. И гадать на кофейной гуще я тоже не буду )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381479
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecator,

Какое мне дело, нужен он тебе или нет?
У меня необходимости нет
Я дал тебе возможность эту необходимость сгенерить
Или сгенерировать код самостоятельно, открыв исходники и бинарники утилиты
Мне глубоко плевать, что там тебе нужно или нет. И гадать на кофейной гуще я тоже не буду )
но ты же гадаешь, и остановить свою фантазию ну никак не можешь.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381480
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Ты на виртуалке тестировал?
Может быть и теги тоже медленнее работают?

По поводу фамилий. Бери реальную выборку ФИО на 2000 человек - и будем смотреть
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381482
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,


И в чем же это гадание выражается?
Смешной ты, честное слово )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381484
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecator,


И в чем же это гадание выражается?


на мою подколку 20088831 тебя растащило на десяток сообщений, не относящихся к делу.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381489
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТы на виртуалке тестировал?
Нет. Хоть это и не имеет значения.

SOFT FOR YOUМожет быть и теги тоже медленнее работают?
Нет. С тегами результат воспроизводим, но цифры разумеется другие.

SOFT FOR YOUПо поводу фамилий. Бери реальную выборку ФИО на 2000 человек - и будем смотреть
Почему только 2 тысячи, мне 248 больше нравятся.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381493
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

И да, смоделируй, пожалуйста, ситуацию, близкую к реальной, где понадобится хеш по Фамилиям?
Поисковые системы типа регистратуры выдают результаты после 3 введённых букв. И хеш по фамилиям тут не катит. Разве что по первым трём буквам )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381496
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

На свою подколку, я тебе сказал, что это реально
Остальное - не более чем твои влажные фантазии
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381500
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecator,

На свою подколку, я тебе сказал, что это реально
Остальное - не более чем твои влажные фантазии
ты мне начал втирать про то, чтобы я взял и сделал то, что мне не надо.
так что фантазии у тебя
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381504
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Ты начал втирать, что я грозился. Хотя было ясно, чётко, понятно, что это не так :)
Причём, что забавно, это было даже в тех цитатах, которые ты приводил в качестве аргумента )))
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381505
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecator,

Ты начал втирать, что я грозился. Хотя было ясно, чётко, понятно, что это не так :)
Причём, что забавно, это было даже в тех цитатах, которые ты приводил в качестве аргумента )))
о боже
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381506
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUИ да, смоделируй, пожалуйста, ситуацию, близкую к реальной, где понадобится хеш по Фамилиям?
Поисковые системы типа регистратуры выдают результаты после 3 введённых букв. И хеш по фамилиям тут не катит. Разве что по первым трём буквам )
Я понять не могу, ты всё еще пытаешься написать хеш "подходящий вообще для всего", или ищешь возможность оправдаться?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381518
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Для всего хорош Дженкинс. Может быть Сейджвик, его тоже надо проверять, интересно, почему его Эмба не взяла
Но хеш-таблицы не используются для всего. Каждый случай уникальный
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381523
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Если ты приколебался про пост, где после "для всего" поставил смайл - так это ежу должно быть понятно, что для множества похожих слов он не годится. Тем более, я потом правил функцию. Или к чему все твои наезду?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381544
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUНо хеш-таблицы не используются для всего. Каждый случай уникальный
Конечно используются. Моя таблица используется в условиях, когда я понятия не имею, что в неё будет загружено. TDictionary вообще универсал.

SOFT FOR YOUЕсли ты приколебался про пост, где после "для всего" поставил смайл - так это ежу должно быть понятно, что для множества похожих слов он не годится.
Ежу-то может оно и понятно, а кто по русски читает, тот понимает только то о чём прямо написано. Перестань уже изворачиваться. Облажался, так признай это.

SOFT FOR YOUТем более, я потом правил функцию.
Ну так я и проверял её до самой последней мутации, чуда не случилось.

Ты тут вообще много чуши наговорил, и про коллизии, и про твой хеш, который подходит для всего... В следующий раз проверяй то о чём пишешь. Мне совсем не интересно с тобой препираться.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381563
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Тогда может ответишь, почему Седжвик, а не Дженкинс? Почему хеш не побайтовый? Зачем, наконец, сторона степени двойки, а не простое число?

Или что, коллизии уже не так важны?
Определись уже, я чушь порю, или ты лажаешь с реализацией?

P.S. нахрена опять ты говоришь про свою таблицу или про дженерик? Почему просто нельзя согласиться с тем, что юзание хеш-таблиц узко специализировано и уникально? Нафига эти детские перипетии?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381588
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТогда может ответишь, почему Седжвик, а не Дженкинс? Почему хеш не побайтовый? Зачем, наконец, сторона степени двойки, а не простое число?
Седжвик, потому что он лучше подходит для моих условий - каких угдно строковых ключей в UTF-16. По той же причине он символьный, а не байтовый. Ну а к размеру вообще привязки нет, поддерживаются оба варианта.

SOFT FOR YOUИли что, коллизии уже не так важны?
Коллизии хеша это однозначный удар по производительности, как бы ни была реализована таблица, пойми это наконец.

SOFT FOR YOUОпределись уже, я чушь порю, или ты лажаешь с реализацией?
Ты порешь чушь. Если ты внимательно читал, то должен был видеть, что я приводил замеры производительности и своей таблицы, и TDictionary, и таблицы Шарахова.

SOFT FOR YOUПочему просто нельзя согласиться с тем, что юзание хеш-таблиц узко специализировано и уникально?
Потому что это не так. Потому что использование универсальной таблицы является более частым вариантом, чем использование узкоспециализированной. Это должно быть понятно тем, кто знаком с понятием достаточной производительности.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381605
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Ты уникальный человек
В одном и том же сообщении умудряешься говорить об универсальности, хвастаешься подобранным хешем под частный случай, подчеркиваешь особую важность коллизий для производительности, и берёшь не самую распределяющую функцию. Ах да, ещё и размер таблицы делаешь не по канонам.

Это пять!
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381637
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Используемый мною символный Седжвик, на строковых ключах в UTF-16, даёт хорошее распределение даже будучи адаптированым под байтовые строки, или просто байтовые последовательности. Изменения алгоритма не требуется. Это универсальный хеш. Используется потому, что работает быстрее Дженкинса.

Теперь о моей таблице. Моя таблица использует только строковые ключи в UTF-16, и поэтому, по дефолту, использует символьный хеш Седжвика. Алгоритм работы таблицы не завязан именно на строковые ключи в UTF-16. Адаптировать таблицу можно на любые типы ключей, алгоритм работы от этого не изменится. Это универсальная таблица. Собственно говоря, любая таблица реализующая классический алгоритм ни коим образом не зависит от используемых ключей, только от используемого хеша.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381656
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Это что же получается...
Не я ерунду говорю, указывая на быстрый хеш ценой дополнительных коллизий, а ты устраиваешь шоу, руководствуясь озвученными мной принципами?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381670
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЭто что же получается...
Не я ерунду говорю, указывая на быстрый хеш ценой дополнительных коллизий, а ты устраиваешь шоу, руководствуясь озвученными мной принципами?
Ну что за бред опять? Твой, "супер быстрый, подходящий для всего вообще", хеш претерпел уже столько алгоритмических мутаций, что я со счёта сбился, а хорошего распределения так и не даёт. Седжвик с Дженкинсом дают сравнимое распределение, но при этом Седжвик быстрее. Сравнил, тоже мне.

Я тебе повторяю уже в который раз - скорость хеша важна, но только после того, как он перестанет генерировать коллизии пачками.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381681
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Опять не можешь признать собственный косяк?
Ты используешь модификацию Седжвика, а не универсальный байтовых оригинал. Потому, что он в 2 раза быстрее.
Ты используешь не Дженкинса потому, что Дженкинс медленнее. Хоть и меньше коллизий даёт.
И размер таблицы не простое число только потому, что mod во много раз медленнее and
Кстати ты ни разу не говорил про "коллизии пачками". Ты говорил о коллизиях и только о них.

Теперь по поводу функции.
Я говорил о реальных ситуациях. Сериализация, поиск токенов. Других реальных задач я не знаю. Ну может быть поиск имён файлов.
Ты же говоришь о синтетических ситуациях. Множество коротких похожих слов.

Ну и какие ко мне претензии? Что он ищет Лопатина медленнее?
Да кому к черту сдался этот Лопатин в реалиях? Только тебе.
А теги ищет каждый автор парсера.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381733
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUОпять не можешь признать собственный косяк?
Не вали-ка ты с больной головы на здоровую.

SOFT FOR YOUТы используешь модификацию Седжвика, а не универсальный байтовых оригинал. Потому, что он в 2 раза быстрее.
Что логично. Только не модификацию, а адаптацию. Там алгоритм не тронут вообще.

SOFT FOR YOUТы используешь не Дженкинса потому, что Дженкинс медленнее. Хоть и меньше коллизий даёт.
Снова ты несёшь чушь. На русских словарях Дженкинс хуже Седжвика, хоть и совсем незначительно, но при этом медленне.

SOFT FOR YOUИ размер таблицы не простое число только потому, что mod во много раз медленнее and
Нет, просто у Шарахова была такая таблица, поэтому и замеры сделаны на идентичном варианте. Но вот прямо сейчас заменил And на Mod - разница на наборе в 1млн. ключей всего несколько миллисекунд, в конечном итоге. А если не просто поменять And на Mod, а изменить режим работы таблицы, чтобы её внутренний размер перестал быть кратен степени двойки, то разница на наборе в 1млн. составила всего 26 msec. (7%) на вставке, и 14 msec. (6%) на поиске. Зато потребление памяти снизилось на 4.5Mb (15%).

SOFT FOR YOUКстати ты ни разу не говорил про "коллизии пачками". Ты говорил о коллизиях и только о них.
Пачками - фигуральное выражение. Ну, если на наборе 248 тыс. фамилий хеш даёт 52 тыс. коллизий, как это ещё назвать? А когда на наборе в 1млн. никому не нужных ключей хеш чуть не весь миллион, а конкретно 900 тыс., обращает в коллизии, то что это? Но, это никому не нужные ключи виноваты, я в курсе.

SOFT FOR YOUЯ говорил о реальных ситуациях. Сериализация, поиск токенов.
Да ты говорил о столь же синтетической задаче, сколь и никому не нужные, по твоему, мнению ключи. В задаче Свириденкова набор был динамическим, с неизвестным содержим, а у тебя четыре десятка статических тегов.

SOFT FOR YOUДругих реальных задач я не знаю.
Отлично. Давай на этом и закончим.

SOFT FOR YOUТы же говоришь о синтетических ситуациях. Множество коротких похожих слов.
Да у тебя всё что тебе не нравится, всё сиснтетическая ситуация. Ну извините, других русских фамилий у меня для вас нет.

SOFT FOR YOUНу и какие ко мне претензии? Что он ищет Лопатина медленнее?
Да кому к черту сдался этот Лопатин в реалиях? Только тебе.
К тебе нет никаких претензий. Но вот твой хеш, который "быстр и удобен вообще для всего )" - полный шлак.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381747
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Этот шлак обогнал твои хеши на реальной задаче. Получается, не такой уж и шлак?
Ты почему-то думаешь, что при увеличении количества тегов, ситуация изменится кардинально

Ты запарен на теории, коллизиях и всё такое.
Я об этом и писал, что есть 4 параметра, которые нужно учитывать в сумме. А не 1 как у тебя

Для Лопатина имеет смысл написать другой хеш
Или вообще для строк - более быстрый хеш
Но ты ведь дальше Byte-->Word не продвинулся, правда? )
И как свою таблицу сделать быстрее - ты видимо тоже не сильно думаешь
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381757
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Ты мне надоел, совершенно не хочешь понимать о чём тебе пишут. Я больше не стану тратить на тебя своё время. Удачи.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381761
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Наконец-то
А то я думал и дальше будешь морочить мне голову своими частными, но универсальными хешами
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381780
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кое как дочитал
не спорьте, есть задачи где хеш-таблицами категорически нельзя пользоваться по требованиям безопасности
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381899
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, а ты индексный доступ специально делал? Просто для перебора ключей? Просто думаю насколько велика вероятность, что появится нужда в этом
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381912
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

А на такой функции графическое распределение можете показать:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function ELFHash(const Value: String): Integer;
var
  i, x: Integer;
begin
  Result := 0;
  for i := 1 to Length(Value) do
  begin
    Result := (Result shl 4) + Ord(Value[i]);
    x := Result and $F0000000;
    if (x <> 0) then
      Result := Result xor (x shr 24);
    Result := Result and (not x);
  end;
end;


?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381913
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

Я заметил что отлаживаться при работе через индекс гораздо удобней, чем при работе по энумератору.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381917
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyУ меня лучший результат на поиске по причине другой организации данных в таблице (для снижения расхода памяти, из-за размера хранимых значений + индексного доступа). В общем, если привести структуру ко классической таблице, то и по поиску будет паритет.

Насчет снижения расхода памяти не понял. Нам пофиг где там данные, в таблице или снаружи. Мы тестируем только таблицу, к данным не обращаемся, потому как это все всегда можно сделать как угодно.

И еще, ты заметил, что у меня кроме
function FindName(const Name: RawByteString): integer;
есть
function GetItemByName(const Name: RawByteString): PShaStringDictionaryItem;
?

Это аналог "найти+доступ по индексу", а после этого можно править на месте и все такое. Хотя я не понимаю причем тут вообще это, если тестируем голую таблицу?

Может перетестить надо? )

До кучи там еще есть энумератор для прохода по непустым.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381918
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerа ты индексный доступ специально делал? Просто для перебора ключей?
Специально. Вообще, главной задачей было сохранить порядок ключей.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381919
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Распределение для ELFHash. Словарь Лопатина:
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381921
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Распределение для ELFHash. Словарь Российских фамилий:
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381922
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Распределение для ELFHash. Строковые GUIDS:
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381924
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Спасибо. И как Вам распределение данной функции?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381926
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovНасчет снижения расхода памяти не понял. Нам пофиг где там данные, в таблице или снаружи. Мы тестируем только таблицу, к данным не обращаемся, потому как это все всегда можно сделать как угодно.
Ну вот у тебя элемент таблицы состоит из Hash, Key, Value. Value у тебя объект, 4 байта, у меня Value 16 байт. У таблицы нехилая избыточность, соответственно за счёт неиспользуемых Value набегает хороший оверхед по памяти. Поэтому у меня Value отделены от самой таблицы, за счёт этого экономится память.

Что я сделал с твоей таблицей. Поменял твой 4-байтный Value, на свой 16-байтный Value, дабы корректно оценить скорость вставки. Но из-за этого при поиске твоя таблица стала менее cache friendly, отсюда и отставание. Поэтому я и сказал, что если мне свою таблицу привести ко классической структуре, то она не будет показывать лучший результат на поиске.

Aleksandr SharahovЭто аналог "найти+доступ по индексу", а после этого можно править на месте и все такое. Хотя я не понимаю причем тут вообще это, если тестируем голую таблицу?

Может перетестить надо? )
Не надо. Там всё честно протестировано (на поиске тестировался только поиск, данные по ключам не вычитывались). Я индексный доступ упомянул, просто для того чтобы стало понятнее о другой внутренней структуре моей таблицы.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381927
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyЧто я сделал с твоей таблицей. Поменял твой 4-байтный Value, на свой 16-байтный Value.

Не понял. Зачем? Правильнее было наоборот сделать. Поменять твой 16 на 4. Данные на вставляем же.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381933
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Спасибо. И как Вам распределение данной функции?
Чем более схожи ключи, тем хуже распределение.

Вот распределение ELFHash для последовательных ключей index1 .. index262144:
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381935
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovНе понял. Зачем? Правильнее было наоборот сделать. Поменять твой 16 на 4. Данные на вставляем же.
Мне бы пришлось полностью изменять структуру своей таблицы, просто по времени было бы более затратно.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381936
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyAleksandr SharahovНе понял. Зачем? Правильнее было наоборот сделать. Поменять твой 16 на 4. Данные на вставляем же.
Мне бы пришлось полностью изменять структуру своей таблицы, просто по времени было бы более затратно.

Ну тогда вообще ничего не менять.
Главное, чтобы при тестировании размер элемента в обеих таблицах точно совпадал. Иначе всегда проиграет тот, у кого в таблице размер элемента больше, т.к. там и вставка и поиск обращаются практически по случайным адресам в пределах таблицы. Получается тестируем кеш.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381938
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovГлавное, чтобы при тестировании размер элемента в обеих таблицах точно совпадал.
С этим-то как раз и проблема. Без переделки структуры моей таблицы этого не сделать.

Aleksandr SharahovИначе всегда проиграет тот, у кого в таблице размер элемента больше, т.к. там и вставка и поиск обращаются практически по случайным адресам в пределах таблицы. Получается тестируем кеш.
Я же говорил, что напрямую сравнить не получится. Вот сейчас без переделки структуры "просто" заменил свой value на объект, в твоей тоже вернул объект и проверил на реальном железе: по вставке паритет 26/29, на поиске (1 тыс. итераций) 17700/19193. Теперь твоя таблица оказалась в более выгодном положении и на поиске появилось опережение.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39381997
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Вот это как раз и интересно.
Для корректного сравнения твой элемент таблицы должен полностью совпадать с моим (добавь TObject).
Работу со своим Value на время закомментируй, а добавленному полю присваивай адрес передаваемых данных.
Разница в скорости как раз и покажет разницу в алгоритмах вставки и поиска.
По идее, если ты упорядочиваешь данные при вставке, все должно совпасть,
если нет, то на вставке ты должен выиграть, на поиске проиграть.
Очень интересно на сколько.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382018
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Или еще вариант.
Для закомментировать TObject в моей структуре (и всю работу с ним).
И убрать работу с Value у тебя.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382100
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Сделал одинаковым размер элементов таблиц. Пришлось изменить структуру у своей таблицы. В результате вставка/поиск: моя - 25/16761, твоя - 26/16237. У меня переупорядочивание не выполняется.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382154
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

совсем почти вровень,
посмотрю еще, может получится побыстрее вставку сделать.

Не помню, результаты поиска в TDictionary ты приводил?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382171
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahovсовсем почти вровень,
посмотрю еще, может получится побыстрее вставку сделать.
Я ещё не убрал дополнительный вызов на вычислении хеша, не стал совсем-то уж маньячить :)

Aleksandr SharahovНе помню, результаты поиска в TDictionary ты приводил?
Приводил, но там было с моим Value. Вот TDictionary<UnicodeString, TObject>: 81/32369
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382295
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте таблицами мериться
Выложите 1 проект с 2 вариантами таблиц и возможностью добавить третью
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382301
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно даже дженерик заколбасить
Когда Key string, а Value - произвольный тип
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382306
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И пусть этот Value будет размером, например, 23 байта, и содержать будет хотя бы один из сложных типов: string/interface/дин.массив
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382534
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да вы маньячки, товарищи!
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382542
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57,

Маньяк здесь только один человек - я )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382605
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUДавайте таблицами мериться
Выложите 1 проект с 2 вариантами таблиц и возможностью добавить третью
ну да, очень увлекательное занятие
мерил как-то свои поделки мапы и сеты
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382617
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Так то деревья
А это хеши
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382646
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,
там всё вместе
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382649
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

Ну значит 4 таблицы
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382720
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
За пол дня почему-то так ни у кого и не хватило смелости сравнить таблицы
Совпадение?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382721
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUЗа пол дня почему-то так ни у кого и не хватило смелости сравнить таблицы
Совпадение?
просто всем пофигу на твои потуги.
Иди допиливай супербыстрый менеджер памяти, там у тебя протухло
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382722
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382726
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Дружище, если бы было всем пофиг, люди бы не обоссывались за свои суперхеши на 10 страниц, не писали статьи и не генерировали гифки. Это к сожалению далеко не первый раз, когда на предложение посоревноваться на чем то реальном - языки засовывают сам знаешь куда
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382729
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecator,

Дружище, если бы было всем пофиг, люди бы не обоссывались за свои суперхеши на 10 страниц, не писали статьи и не генерировали гифки. Это к сожалению далеко не первый раз, когда на предложение посоревноваться на чем то реальном - языки засовывают сам знаешь куда
знаешь, дружище, от тебя очень много понтов, но пока всё ещё нуль в результате.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382731
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Я предприниматель в двух странах и живу за границей
Для начала )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382732
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecator,

Я предприниматель в двух странах и живу за границей
Для начала )
ну и что ? ты ТУТ очень много кидал понтов, результат где ?
Тот, который самый быстрый в мире, покроет всех кобылиц и так далее ?
ГДЕ РЕЗУЛЬТАТ ?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382735
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Ты слепой?
У меня есть страница на гитхабе https://github.com/d-mozulyov
Каждая библиотека показала себя на тестах, бенчмарки есть. Есть баги и роудмапы. Как и в любом другом продукте. И да, понты - у тебя в голове. Нормальным мужикам интересно соревноваться, общаться и развиваться в своей области
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382736
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЗа пол дня почему-то так ни у кого и не хватило смелости сравнить таблицы
Совпадение?Серьезные люди обсудили интересные аспекты, постарались не смеяться над твоим хэшем и разошлись. Чего ещё надо? (риторически)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382738
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecator,

Ты слепой?
У меня есть страница на гитхабе https://github.com/d-mozulyov
Каждая библиотека показала себя на тестах, бенчмарки есть. Есть баги и роудмапы. Как и в любом другом продукте. И да, понты - у тебя в голове. Нормальным мужикам интересно соревноваться, общаться и развиваться в своей области

какие соревнования, если ты вопишь, что готов уделать всех,
а на деле сливаешься ?

Даже не будем ходить далеко.
Где самый быстрый в мире менеджер памяти ? ГДЕ ?
Обосрался - обтекай
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382742
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

На тегах (да и на словаре) мой хеш обогнал. Если предел возможностей таких людей - на 10 страниц обсуждать один единственный алгоритм - мне искренне жаль таких людей
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382743
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382745
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUdefecator,



мне на твои таблицы глубочайше насрать,
потому что твой менеджер памяти сливается на реальном приложении 24x7 в Out of memory

Мне этого достаточно, чтобы говорить, что ты слился.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382746
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Винда тоже иногда глючит. И что, ты скажешь Бил слился?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382751
Товарищ старший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUdefecator,



Не настораживает тот факт, что несмотря на красивую таблицу, люди активно желают не пользоваться твоими продуктами?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382753
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищ старший сержант,

Я постоянно получаю сообщения в скайп на тему как лучше пользоваться той или иной фичей. Когда следующее обновление и что войдёт. В том числе и из-за границы. В том числе и по BrainMM. Более того, это наиболее интересный людям продукт. Видимо всё-таки используют.

Я задам встречный вопрос. Тебя не смущает, что вместо написания хорошей хеш-таблицы, или как минимум интереса к оной, ты предпочитаешь обсуждать мою личность )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382756
Товарищ старший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,
Ну так и общался бы в скайпе. А для публикации кода бложик заведи.

А то заваливаешь форумы своими странными, совершенно не нужными проектами.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382766
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищ старший сержант,

Странный ты товарищ. Есть проект на гитхабе. Ему соответствует ветка на форуме. А если ты не в состоянии применить ту или иную библиотеку - это уже не ко мне вопрос. И ты, мне кажется, много на себя берёшь, рассуждая, нужны они кому-то или нет )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382767
Товарищ старший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

а почему ты считаешь, что я много на себя беру? Совершенно очевидно, что ты пустозвон.

Сколько пафоса было с "Lua for Delphi" (например). И чем дело закончилось?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382771
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищ старший сержант,

Кончилось тем, что люди как юзали Lua на старых Delphi, так и юзают
А на новых - сильно расстраиваются, что нет
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382791
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет. Диспут интересный.

Я, конечно, не спец в хешах, но как-то кажется мне, что уж очень "синтетические" исходные данные.
Неудачно выбраны imho.
Ну в самом деле! Словарь РЯ! Тут ведь корни! Соответсвенно, множество однокоренных слов.
(кстати, на гифках была видна какая-то закономерность-"повторяемость")
Словарь Русских личных имён собственных - вообще не в тему (Иванов, Иванков, Иванович, Иванкович, Иванушкин...)

А вот... Чтобы вам не выбрать какой-нибудь русский технический словарь терминов?
Только не химический - там всё тетра, да окси с нитро.

Например надыбать Торговые Названия лек.средств.
Или Словарь морских терминов, Авиационный, моторостроительный и т.п.
______________
Я не претендую.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382799
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gator,

Словарь задача не такая уж искусственная. У меня как раз сейчас возможен вариант по построению ассоциативного массива по всем словам текста.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382801
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gator,

Полностью согласен с тобой
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382809
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovGator,

Словарь задача не такая уж искусственная. У меня как раз сейчас возможен вариант по построению ассоциативного массива по всем словам текста.Ну нет. Всё же Текст это не Словарь (не упорядочен и очепятки к тому же)
И если не "гальюны на галсах с кнехтами" пусть уж "Война и Мир", например.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382822
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саша, пройдись по коду, везде ли я поставил инициализацию/финализацию?

По идее нужны нотификаторы как в стандартном TDictionary. Хотя бы на удаление и замену (в оригинале удаление+добавление)

Модератор: Вложение удалено.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382828
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТоварищ старший сержант,

Кончилось тем, что люди как юзали Lua на старых Delphi, так и юзают
А на новых - сильно расстраиваются, что нет
https://github.com/felipedaragon/pLua-XE
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382969
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUСаша, пройдись по коду, везде ли я поставил инициализацию/финализацию?
По идее нужны нотификаторы как в стандартном TDictionary. Хотя бы на удаление и замену (в оригинале удаление+добавление)

Похоже надо кое-что прояснить.

Идея описать другие хеш-функции сообществу родилась по трем причинам:
1. Мне показалось, что в ходе обсуждения начала формироваться мысль, что каноническая реализация Седжвика - наше все. На самом деле Седжвик - это целое семейство функций, которое можно подстроить под язык и множество слов. Я порулил только одним параметром, но идея должна быть понятна.
2. Мне показалось, что идея простоты хеш-функции некоторыми участниками дискуссии возводится в абсолют и они несколько хаотично ей следуют. Хотя в целом верно, но давайте использовать хотя бы школьные знания, если не хотим читать теорию. Отсюда берется вторая хеш-функция.
3. Хеш-функции имеют 2 главных применения - сравнение данных и поиск данных. Наиболее просто продемонстрировать достоинства и недостатки хеш-функций можно на хеш-таблицах. Отсюда вытекает вторая часть статьи.

На самом деле в своей работе я никогда не использовал хеш-таблиц в том виде, как там описано. Иногда надо было надо хранить только строки или только числа (без объектов). Иногда именованные объекты (имя не снаружи а внутри объекта) иногда объекты с идентификаторами. Так что класс TShaStringDictionary реализован только для демонстрации идеи, и я серьезно подумываю, чтобы его заменить, скажем, классом TShaNamedObjectDictionary. Так что все мои применения самописных подобий словарей чаще всего сводились к следующему
1. Создать контейнер заданной емкости.
2. Наполнить (возможно с переаллокациями).
3. Что-то много искать.
4. Очистить (обычно с сохранением размера).
5. Если надо, повторить с п.2
6. Пробежаться и собрать статистику.
Никакие удаления и нотификации мне ни разу не требовались. Свойство Owned - да, часто может упростить код. Но нотификации, на мой взгляд, все равно проще самому ручками.

Теперь относительно кода. Там же написано "берите, кто хотите, и делайте, что хотите".
Можете даже сослаться на оригинальный код автора, если хотите.
Но только большая просьба:

НЕ ПИШИТЕ НА СВОЕМ КОДЕ, ЧТО ЭТО МОЙ КОД.

P.S. У меня в Delphi7 твой даже не компилируется.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39382999
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Ну с дженериками то ты знаком?
Меня удивляет распространённая тут позиция "функция наше всё", ровно как тебя удивила аналогичная фраза с Седжвиком. Очевидно, кроме функции, есть существенный ряд других особенностей, внутри таблицы. На мой взгляд твоя реализация достаточно слаба.

Я поправил твой класс на дженерик, где в качестве Value может быть произвольный тип. И попросил тебя проверить. Надеюсь, господин Казанцев тоже выложит свою реализацию. Насколько я помню, его реализация подразумевала произвольный тип в качестве Value

А по поводу нотификаторов - всё просто. У тебя есть возможность высвобождать экземпляры класса, то же самое делается в дженериках по нотификатору
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383178
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

А ты видел структуру его таблицы?
Я что-то пропустил )

Эмбы очень обидятся, узнав, что их ты тоже считаешь идиотами
Главное, чтобы об этом не узнали Майкрософт, Oracle и другие разного калибра IT-компании, использующие контейнеры на основе хеша )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383246
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выше писал уже: элемент правильной хеш-таблицы состоит ровно из двух полей хеш-код и объект (или индекс объекта в другом хранилище).
Если другого хранилища нет, то возможны различные варианты эмуляции правильной таблицы в зависимости от размера значения: короткое - вместо объекта, среднее и длинное - в доп. массиве. При этом для средних и длинных возможны свои варианты организации.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383258
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Ну и в чем тогда проблема, что я Obj заменил на Value?
Я у тебя спросил, правильно ли расставлены инициализаторы/финализаторы. Чтобы потом замерить производительность твоего решения

И ещё. Не хочешь видеть чужой код - пиши свой. Не хочешь свой - не кричи тогда по поводу копирайтов. Чья ещё эта таблица если не твоя? Устроил тут )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383282
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUНу и в чем тогда проблема, что я Obj заменил на Value?

Проблема в том, что SizeOf(Value)<>4

SOFT FOR YOUНе хочешь видеть чужой код - пиши свой. Не хочешь свой - не кричи тогда по поводу копирайтов. Чья ещё эта таблица если не твоя? Устроил тут )

Ты правда идиот?
Напиши, что это твой код.
Если хочешь, напиши что взял за образец код с моего сайта.
И нет проблем.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383305
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Для твоего алгоритма нет разница, равен размер Value 4 или нет
Нет, я буду распространять этот модуль с твоими копирайтами и пусть люди подумают, что ты умеешь делать дженерики
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383312
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUпусть люди подумают, что ты умеешь делать дженерики

Да ! Пихайте ! пихайте это дженериковое говно везде !
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383317
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Спасибо, что одобряешь :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383319
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUAleksandr Sharahov,

Для твоего алгоритма нет разница, равен размер Value 4 или нет
Нет, я буду распространять этот модуль с твоими копирайтами и пусть люди подумают, что ты умеешь делать дженерики

Но есть разница в скорости.
Так что пусть лучше люди думают, что ты можешь писать только тормознутый код.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383342
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Саня, чё ты взьелся?
Дженерики есть с 2009 года, всю черновую работу я тебе уже прописал. На тот случай если ты сам не умеешь, или времени нет, или оба варианта. У Казанцева таблица универсальная, у Эмбы (да и вообще у всех) универсальная, у тебя только TObject-ы. Надо же сравнивать твою таблицу на универсальном Value, а ты вместо благодарности слюной брызжешь.

По поводу скорости... а ты думаешь другим авторам таблиц легко?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383386
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUДженерики есть с 2009 года, всю черновую работу я тебе уже прописал. На тот случай если ты сам не умеешь, или времени нет, или оба варианта. У Казанцева таблица универсальная, у Эмбы (да и вообще у всех) универсальная, у тебя только TObject-ы.
У нас разные представления об универсальности. Как сделать универсально на TObject, я уже писал не раз.
А реализация на Value в твоем исполнении - это полный бред и я так никогда бы не сделал.

SOFT FOR YOUНадо же сравнивать твою таблицу на универсальном Value, а ты вместо благодарности слюной брызжешь.
Если хочешь сравнить свою реализацию с моей - бери код с сайта без всяких изменений.
А в своем коде поменяй Value на TObject.

SOFT FOR YOUПо поводу скорости... а ты думаешь другим авторам таблиц легко?
Вот соревнуйтесь между собой.
Нефиг ломать чужой код, а потом выезжать на белом коне.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383398
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUУ Казанцева таблица универсальная
В который раз убеждаюсь, что ты, либо не читаешь, либо не понимаешь написанного. На счёт универсальности перечитай ещё раз . Речи о данных не было вообще.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383429
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

TObject плох тем, что для каждого экземпляра дёргается менеджер памяти, куча обвязок типа Before/After, Init/Cleanup. В случае менеджмента структурами менеджер задействуется при реаллоке, а поля могут вообще никак не модифицироваться если нет сложных типов из строк/интерфейсов/дин.массивов

Поэтому если ты думаешь, что сделать TObject это большое достижение - то ты сильно заблуждаешься. Нет ни гибкости, ни выигрыша по скорости. Почему ты подумал, что при переходе с Obj на дженерик в рамках текущей архитектуры будет проседание по производительности - я не понял. Но если они есть - Эмба, boost и C# как-то решают их. В моей реализации разницы нет

Ты сегодня успел назвать меня идиотом только потому, что "ты бы так не сделал". Аргумент конечно... но слабый. И в целом показывает уровень культуры, я думал, он выше. Нет силы соревноваться - я могу это понять. Если великая ценность твоей статьи в том, что ты немного дополнил Седжвика - я тоже это приму. Но раньше я думал, что уровень твоего профессионализма выше.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383432
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Понятно. Я думал твоя таблица представляет какую-то ценность
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383438
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

культура общения в первую очередь состоит в умении
слушать, что говорит собеседник, и не навязывать ему свою точку зрения,

а как профессионал замени TObject на Pointer
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383446
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Профессиональные авторы контейнеров делают Value универсальным
Глупо нам всем подстраиваться под твой TObject/Pointer только потому, что ты не умеешь дженерики
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383451
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Глупо не понимать, то что разжевано вдоль и поперек.
Как правило, TObject уже существует где-то в момент добавления ссылки на него в таблицу.
А профессиональные авторы контейнеров пишут их для тех, кто не может/не хочет написать контейнер для себя.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383676
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЯ думал, потенциал больше, но окончилось чем окончилосьВопросы связанные с разработкой hash очень важны и интересны.
И действительно использование hash в многих алгоритмах целесообразно.

Понятно, что скорее всего нет и быть не может "универсального" hash.
Нет ли у вас tools, который позволял анализировать входной поток данных и предоставлять рекомендации
по использованию того или иного подхода.
Или к примеру имеет смысл подумать над вопросом "адаптивного" hash.

О чем речь?

Программа в процессе работы в течении некоторого времени ее эксплуатации пытается использовать
тот или иной подход связанный с hash, tree, ... и пытается адаптироваться /то бишь использовать/ самый лучший из ей известный подход.

Понятно, что при таком подходе должны быть использованы интерфейсы, которые бы скрывали native структуры
используемые при обработке данных.
Приблизительно как при разработки interafaces скажем для ActiveX.
В этом случае программа будет как-бы "самоулучшаемая".

Экспромтом.

На счет collision.
Может быть при их возникновении такие данные следует помещать во вторичную hash таблицу /для которой используется иной алгоритм расчета hash/?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39383789
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012,

Относительно хешей очень много теории и разработок.
В частности, ваш экспромт называется FKS Hashing. У него рассматриваются статический и динамический варианты.
Есть его же развитие на случай вторичного хеширования. В частности доказывается, что для вторичного хеширования можно из очень простого семейства линейных хешей выбрать такие, что там не будет коллизий, а суммарный размер таблиц будет при этом расти линейно.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39384880
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пошарился тут по коду TDictionary в Seattle.

Заменил хеш-функции для Integer и String ключей на свои.

Результаты:
с родным System.Generics.Defaults.pas
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
1. Benchmark TDictionary<Integer,Integer>
   Add 10.000.000 integers. 1734 msec.
   Add 10.000 integers in 10.000.000 iterations. 484 msec.
   Locate 10.000 integers in 10.000.000 iterations. 422 msec.

2. Benchmark TDictionary<string,Integer>
   Add 1.000.000 GUIDs. 469 msec.
   Add 150844 strings in 10.000.000 iterations. 1844 msec.
   Locate 150844 strings in 10.000.000 iterations. 1593 msec.
с кастомным System.Generics.Defaults.pas
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
1. Benchmark TDictionary<Integer,Integer>
   Add 10.000.000 integers. 390 msec.
   Add 10.000 integers in 10.000.000 iterations. 156 msec.
   Locate 10.000 integers in 10.000.000 iterations. 94 msec.

2. Benchmark TDictionary<string,Integer>
   Add 1.000.000 GUIDs. 328 msec.
   Add 150844 strings in 10.000.000 iterations. 1282 msec.
   Locate 150844 strings in 10.000.000 iterations. 1203 msec.

Для Integer словаря выигрыш по скорости оказался в 2-3 раза!
Эти дятлы расчитывали(!) бобом дженкинсом(!) хэши для 1-4 байтных целых.

Для строк переход на Роберта Седжевика дал ускорение поскромней.
Но все равно процентов 30 я выиграл.

Как-то так.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39384881
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, ошибся.

Для Integer словаря выигрыш по скорости оказался не в 2-3 раза, а в 3-4+.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39384883
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У кого берлин стоит, гляньте, там таже фигня?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39384886
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
System.Generics.Defaults.pas

Код: pascal
1.
2.
3.
4.
function GetHashCode_I4(Inst: Pointer; const Value: Integer): Integer;
begin
  Result := THashBobJenkins.GetHashValue(Value, SizeOf(Value), 0);
end;



Такая фигня?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39384896
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatТакая фигня?Угу
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39384919
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЭти дятлы расчитывали(!) бобом дженкинсом(!) хэши для 1-4 байтных целых.
Они не дятлы, просто для универсального, во всех отношениях, TDictionary, по дефолту, выбран обладающий хорошим лавинным эффектом (читай, подходящий для всех типов ключей) Дженкинс. При этом предоставлен механизм замены компарера, где можно реализовать какой угодно хеш. Вот где они налажали, так это в установлении Capacity. Кстати, когда я смотрел на применение словаря в VCL/FMX, то не видел мест, где используются кастомные компареры.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39384991
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем вообще нужна хеш функция для integer?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385020
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЗачем вообще нужна хеш функция для integer?
Я не знаю чем руководствовались в абракадабре, но думаю, что они ориентировались на средний вариант. Например, если мы берём в качестве ключа integer и заполняем таблицу миллионом последовательных ключей, то простое проецирование ключа на хеш даёт хороший результат. Но если мы вставляем миллион рандомных ключей, то производительность деградирует в разы, тогда, как хеш Дженкинса даёт стабильно одинаковый результат. Потестируй у себя, может что интересное получится. У меня, на AMD, Дженкинс немногим медленне худшего случая с рандомными ключами, вдруг у тебя быстрее окажется :)

Кстати, тут ещё могу привести пример, когда медленный Дженкинс уделывает быстрого Седжвика. Я тестировал свою таблицу на nextgen-компиляторе (XE5-6), и несмотря на более быстрый хеш Седжвика и более выгодную организацию данных она совсем немого но опережала дефолтный словарь с Дженкинсом. На последних версиях (XE8-10) моя таблица стабильно медленне дефолтного словаря, хотя тоже очень не на много. После того, как я заменил у себя Седжвика на Дженкинса, моя таблица снова стала быстрее на nextgen, несмотря на то, что Дженкинс медленне. Разница только в компиляторе и архитектуре процессора.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385050
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз уж пошла такая пьянка... Вот набор целочисленных ключей, на которых медленный Дженкинс рвёт в клочья прямое проецирование ключа на хеш:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  For Index := 0 To High(Integer) Do
   If Index And (2097152 - 1) < (1000000 - 5000) Then
    Begin

     dict.Add(index, index);

     If dict.Count = 1000000 Then
      Break;

    End;


Понятное дело, что пример искусственный, но в жизни-то всякое бывает. На этом наборе ключей скорость поиска с Дженкинсом в 55 раз быстрее проецирования, а скорость вставки в 61 раз быстрее. А всё что мы сделали, это сосредоточили входы 1 млн. ключей в первых 995 тыс. яцеек таблицы. Таким образом на проецировании получается 5 тыс. коллизий на входе в таблицу, а у Дженкинса их более 200 тыс., но за счёт хорошего распределения у него очень короткие цепочки, что в результате позволяет ему выиграть.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385060
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyРаз уж пошла такая пьянка... Вот набор целочисленных ключей, на которых медленный Дженкинс рвёт в клочья прямое проецирование ключа на хеш:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  For Index := 0 To High(Integer) Do
   If Index And (2097152 - 1) < (1000000 - 5000) Then
    Begin

     dict.Add(index, index);

     If dict.Count = 1000000 Then
      Break;

    End;


Понятное дело, что пример искусственный, но в жизни-то всякое бывает. На этом наборе ключей скорость поиска с Дженкинсом в 55 раз быстрее проецирования, а скорость вставки в 61 раз быстрее. А всё что мы сделали, это сосредоточили входы 1 млн. ключей в первых 995 тыс. яцеек таблицы. Таким образом на проецировании получается 5 тыс. коллизий на входе в таблицу, а у Дженкинса их более 200 тыс., но за счёт хорошего распределения у него очень короткие цепочки, что в результате позволяет ему выиграть.Я в восхищении от твоей способности подобрать такой тест кейс.
Но достаточно поменять в нем 1 цифру и Дженкинс опять проиграет. :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385061
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyrgreatЗачем вообще нужна хеш функция для integer?
Я не знаю чем руководствовались в абракадабре, но думаю, что они ориентировались на средний вариант. Например, если мы берём в качестве ключа integer и заполняем таблицу миллионом последовательных ключей, то простое проецирование ключа на хеш даёт хороший результат. Но если мы вставляем миллион рандомных ключей, то производительность деградирует в разы, тогда, как хеш Дженкинса даёт стабильно одинаковый результат. Потестируй у себя, может что интересное получится. У меня, на AMD, Дженкинс немногим медленне худшего случая с рандомными ключами, вдруг у тебя быстрее окажется :)
Вот такой код у меня стабильно медленней на дженкинсе.

Код: pascal
1.
2.
3.
    for i:=0 to 9999999 do begin
      A.AddOrSetValue(Random(10000),0);
    end;
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385063
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatНо достаточно поменять в нем 1 цифру и Дженкинс опять проиграет. :)
Это и понятно, но замена той же цифры может затормозить проецирование вообще в бесконечность. Вот тебе готовый сценарий для DOS-атаки, на таблицу ;)

rgreatВот такой код у меня стабильно медленней на дженкинсе.
На сколько, в процентном отношении?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385066
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Кстати, если мне не изменяет память, у тебя таблица разруливала коллизии методом цепочек. Если всё так, то её этот вариант радикально затормозить не должен.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385069
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyrgreat,

Кстати, если мне не изменяет память, у тебя таблица разруливала коллизии методом цепочек. Если всё так, то её этот вариант радикально затормозить не должен.Угу. Она у меня скажем так "стабильно не очень быстрая".
Соседние коллизии друг на друга не влияют, но зато идет высокая нагрузка на менеджер памяти.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385070
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyНа сколько, в процентном отношении?

Дженкинс: Add 10.000 integers in 10.000.000 iterations. 625 msec
Без него: Add 10.000 integers in 10.000.000 iterations. 312 msec.

в 2 раза.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385072
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatСоседние коллизии друг на друга не влияют, но зато идет высокая нагрузка на менеджер памяти.
На nextgen не проверял, а то там с менеджером совсем плохо?

rgreatв 2 раза.
О! У меня всего 20-25%
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385084
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyО! У меня всего 20-25%
Это от того, что у меня верхняя граница High(Integer);
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385086
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyKazantsev AlexeyО! У меня всего 20-25%
Это от того, что у меня верхняя граница High(Integer);Похоже на то.
Но этот случай для ключей не очень вероятный.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385089
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyНа nextgen не проверял, а то там с менеджером совсем плохо?
Думаю там многое будет зависить от конкретной реализации в OS. Да и разброс в железе велик.
Замучаешься выводить закономерности.

Небось придется делать свой микро-менеджер памяти внутри цепочки.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385090
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот мой тестовый пример.

http://www.rgreat.ru/tmp/Test.zip

Я там базовые модули Generics.* переименовал в Indexes.* для простоты.

Для теста достаточно в Indexes.Collections.Pas поменять Uses

Код: pascal
1.
2.
3.
4.
5.
uses
  System.Types,
  Indexes.Defaults,
//  Generics.Defaults,
  System.SysUtils;
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385091
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня с базовыми TDictionary результат пока такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
Preparing GUIDs...Done.
Loading Dictionary...Done.

1. Logic Tests TArrayEx<Integer>
   0;1;1;1;1;2;2;2;2;2;2;3;3;3;3;3;3;4;4;4;4;4;5;5;5;5;5;5;6;6;6;7;7;7;8;8;8;8;8;9
   Length of array A = 40
   0;1;2;3;4;5;6;7;8;9
   Length of array B = 10
   These are equal: 0
   B in A: -1
   C:=A+B
   0;1;1;1;1;2;2;2;2;2;2;3;3;3;3;3;3;4;4;4;4;4;5;5;5;5;5;5;6;6;6;7;7;7;8;8;8;8;8;9;0;1;2;3;4;5;6;7;8;9
   Length of array C = 50
   Value "5" found 7 times in array C, at indexes = [22;23;24;25;26;27;45]
   Implicit cast to array passed.

2. Benchmark TArrayEx<Integer>
   Add 10.000.000 integers. 578 msec. 31 msec (optimised).
   Add 10.000 integers in 10.000.000 iterations. 672 msec.
   Locate 10.000 integers in 10.000.000 iterations. 671 msec.

3. Benchmark THashTable<Integer,Integer>
   Add 10.000.000 integers. 1688 msec. 687 msec (optimised).
   Add 10.000 integers in 10.000.000 iterations. 313 msec.
   Locate 10.000 integers in 10.000.000 iterations. 281 msec.

4. Benchmark TDictionary<Integer,Integer>
   Add 10.000.000 integers. 1984 msec.
   Add 10.000 integers in 10.000.000 iterations. 641 msec.
   Locate 10.000 integers in 10.000.000 iterations. 500 msec.

5. Benchmark TArrayEx<string>
   Add 1.000.000 GUIDs. 93 msec. 31 msec (optimised).
   Add 150844 strings in 10.000.000 iterations. 2890 msec.
   Locate 150844 strings in 10.000.000 iterations. 2813 msec.

6. Benchmark THashTable<string,Integer>
   Add 1.000.000 GUIDs. 578 msec. 235 msec (optimised).
   Add 150844 strings in 10.000.000 iterations. 2453 msec.
   Locate 150844 strings in 10.000.000 iterations. 2406 msec.

7. Benchmark TDictionary<string,Integer>
   Add 1.000.000 GUIDs. 547 msec.
   Add 150844 strings in 10.000.000 iterations. 2000 msec.
   Locate 150844 strings in 10.000.000 iterations. 1688 msec.

Tests complete.

Но там еще есть чего оптимизировать.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385095
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TDictionary без Дженкинса:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Preparing GUIDs...Done.
Loading Dictionary...Done.

1. Benchmark TDictionary<Integer,Integer>
   Add 10.000.000 integers. 641 msec.
   Add 10.000 integers in 10.000.000 iterations. 297 msec.
   Locate 10.000 integers in 10.000.000 iterations. 218 msec.

2. Benchmark TDictionary<string,Integer>
   Add 1.000.000 GUIDs. 454 msec.
   Add 150844 strings in 10.000.000 iterations. 1906 msec.
   Locate 150844 strings in 10.000.000 iterations. 1578 msec.

Tests complete.

...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385097
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatДумаю там многое будет зависить от конкретной реализации в OS. Да и разброс в железе велик.
Просто там FastMM'а нет :)

rgreatНебось придется делать свой микро-менеджер памяти внутри цепочки.
Мне в паре мест пришлось менять алгоритм работы с памятью :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385099
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyПросто там FastMM'а нет :)Потому и будет. :)

Может через пару лет и FastMM допилят для NextGen? ;)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39385526
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проголосуйте, кому не лень.

https://quality.embarcadero.com/browse/RSP-16730
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39389954
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обновил статью и исходник в свете последних обсуждений
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39389964
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

на таком же тесте с моим словарем на E6850 времена такие
1357
203
78

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
procedure TForm1.Button2Click(Sender: TObject);
var
  OD: TShaObjectDictionary;
  i, j: integer;
  t: cardinal;
begin;
  len:=10000000;
  OD:=TShaObjectDictionary.Create;

  t:=GetTickCount;
  for i:=0 to len-1 do OD.Add(i, pointer(i));
  t:=GetTickCount-t;
  Memo1.Lines.Add(IntToStr(t)); //1357ms
  OD.Clear;

  t:=GetTickCount;
  for i:=0 to len-1 do OD.Add(Random(10000), 0);
  t:=GetTickCount-t;
  Memo1.Lines.Add(IntToStr(t)); //203ms
  OD.Clear;

  t:=GetTickCount;
  for i:=0 to len-1 do OD.Find(Random(10000));
  t:=GetTickCount-t;
  Memo1.Lines.Add(IntToStr(t)); //78ms
  OD.Clear;

  OD.Free;
  end;

...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39389991
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без сравнения с другими мало о чем говорит, кроме того что поиск у тебя гораздо быстрей добавления.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39390012
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatБез сравнения с другими мало о чем говорит, кроме того что поиск у тебя гораздо быстрей добавления.

Это потому, что ищу в пустом словаре )
Сорри, после копи-паста забыл убрать вызов Clear.
После исправления поиск и вставка работают одинаково медленно.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39421977
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Делаю сейчас комплексный бенчмарк. Судя по всему, ты смог добиться действительно классных результатов
Только у тебя много классов, я так и не понял что брать.
В бенчмарке используются классы хеш-таблиц с дефолтными хешами
TDictionary, THashTable или использовать какую-то другую комбинацию кода?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422019
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUrgreat,

Делаю сейчас комплексный бенчмарк. Судя по всему, ты смог добиться действительно классных результатовНадо-же. Я когда их пилил о особой скорости думал.
Сделаешь бенч - интересно будет глянуть.
http://www.rgreat.ru/tmp/Delphi/Test.zip

Только у тебя много классов, я так и не понял что брать.
В бенчмарке используются классы хеш-таблиц с дефолтными хешами
TDictionary, THashTable или использовать какую-то другую комбинацию кода?Если тебе нужны объекты с хешами то:
THashTable<T>
TArrayEx<T>
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422028
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил в свой тест твою Rapid.Generics.
По моим тестам x32 так вышло:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
Preparing GUIDs...Done.
Loading Dictionary...Done.

1. Benchmark TArrayEx<Integer>
Add 10.000.000 integers. 609 msec. 32 msec (optimised).
Add 10.000 integers in 10.000.000 iterations. 688 msec.
Locate 10.000 integers in 10.000.000 iterations. 687 msec.

2. Benchmark THashTable<Integer,Integer>
Add 10.000.000 integers. 1766 msec. 657 msec (optimised).
Add 10.000 integers in 10.000.000 iterations. 265 msec.
Locate 10.000 integers in 10.000.000 iterations. 266 msec.

3. Benchmark TDictionary<Integer,Integer>
Add 10.000.000 integers. 2047 msec.
Add 10.000 integers in 10.000.000 iterations. 641 msec.
Locate 10.000 integers in 10.000.000 iterations. 516 msec.

4. Benchmark TRapidDictionary<Integer,Integer>
Add 10.000.000 integers. 437 msec.
Add 10.000 integers in 10.000.000 iterations. 172 msec.
Locate 10.000 integers in 10.000.000 iterations. 125 msec.

5. Benchmark TArrayEx<string>
Add 1.000.000 GUIDs. 93 msec. 31 msec (optimised).
Add 150844 strings in 10.000.000 iterations. 3063 msec.
Locate 150844 strings in 10.000.000 iterations. 2984 msec.

6. Benchmark THashTable<string,Integer>
Add 1.000.000 GUIDs. 812 msec. 297 msec (optimised).
Add 150844 strings in 10.000.000 iterations. 2422 msec.
Locate 150844 strings in 10.000.000 iterations. 2375 msec.

7. Benchmark TDictionary<string,Integer>
Add 1.000.000 GUIDs. 547 msec.
Add 150844 strings in 10.000.000 iterations. 2171 msec.
Locate 150844 strings in 10.000.000 iterations. 1860 msec.

8. Benchmark TRapidDictionary<string,Integer>
Add 1.000.000 GUIDs. 250 msec.
Add 150844 strings in 10.000.000 iterations. 1875 msec.
Locate 150844 strings in 10.000.000 iterations. 1594 msec.

Tests complete.


На первый взгляд у тебя очень шустро вышло.

В x64 Rapid.Generics не билдится.
Ну и твой TDictionary рушится при Create. Кстати, не надо так называть классы. TDictionary уже есть в базе. :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422032
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Так THashTable<T> или TArrayEx<T>? В чём отличие то? :)
И, помнится (если не путаю), у тебя были более быстрые аналоги хешей. Это в каком модуле и как применять? )
Судя по тому, что я увидел... бегло... у тебя код очень похож на стандартный TDictionary. Имеет ли смысл менять класс, может просто взять твой хеш-компаратор?

Кстати, не надо так называть классы. TDictionary уже есть в базе. :)
Так в том и суть :)
Там полные эквиваленты TDictionary, TList, TQueue, TStack, TArray, ...
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422182
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUrgreat,

Так THashTable<T> или TArrayEx<T>? В чём отличие то? :)
Первое - это словарь.
Второе - массив, с опциональным поиском в нем через хеш.

И, помнится (если не путаю), у тебя были более быстрые аналоги хешей. Это в каком модуле и как применять? )

Судя по тому, что я увидел... бегло... у тебя код очень похож на стандартный TDictionary. Имеет ли смысл менять класс, может просто взять твой хеш-компаратор?
Вот тут возьми.
https://quality.embarcadero.com/browse/RSP-16730

Так в том и суть :)
Там полные эквиваленты TDictionary, TList, TQueue, TStack, TArray, ...Рисковый подход.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422236
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

А в чём преимущество THashTable относительно стандартного TDictionary?
Скинь сюда, пожалуйста, я там не зарегистрирован

В общем скажи наиболее эффективный способ воспользоваться твоими наработками?
THashTable + альтернативные хеши?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422277
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatВот тут возьми.
https://quality.embarcadero.com/browse/RSP-16730


Там рекомендуется
Код: pascal
1.
2.
3.
4.
function GetHashCode_I4(Inst: Pointer; const Value: Integer): Integer;
 begin
 Result := Value;
 end;



Так нельзя делать. Это будет тормозить, например, если все Value имеют вид 256*i.
Имеет смысл использовать функции "взбалтывания", см. пример http://guildalfa.ru/alsha/node/32
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422282
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А альтернативные хеши на дженкинсе никто не делал?
Имею ввиду реализации IEqualityComparer<T>
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422306
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, хотел модуль Шарахова добавить, а UnicodeString нет, RawByteString-таблица основана на поле в обжекте
Нет, хватит париться )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422324
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovТак нельзя делать. Это будет тормозить, например, если все Value имеют вид 256*i.
Имеет смысл использовать функции "взбалтывания", см. пример http://guildalfa.ru/alsha/node/32 Под любой хеш используемый в виде цепочек можно подобрать такие Value что его поставит раком.

Какой смысл все усложнять?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422325
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На случайных ключах для SizeOf(Value)<=4 быстрей чем Hash:=Value нет ничего.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422326
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatAleksandr SharahovТак нельзя делать. Это будет тормозить, например, если все Value имеют вид 256*i.
Имеет смысл использовать функции "взбалтывания", см. пример http://guildalfa.ru/alsha/node/32 Под любой хеш используемый в виде цепочек можно подобрать такие Value что его поставит раком.

Какой смысл все усложнять?

Мы боремся не с атакой на хеш. Это бред.
Мы боремся с регулярностью ключа. А это реальность.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422327
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотел сказать SizeOf(Value)=4.

Там где SizeOf(Value)<4 можно соптимизировать попростому.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422357
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Завершил бенчмарки для проекта Rapid.Generics:
https://github.com/d-mozulyov/Rapid.Generics

Вот бенчмарк по хеш-таблицам:
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422359
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за единицы измерения в этой таблице.

Не комильфо.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422360
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое 8752 и почему оно такое большое?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422361
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Миллисекунды
Но важны не они, а коэффициент прироста производительности
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422362
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем отличается Dictionary of RapidDictionary?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422363
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

8,5 секунд
Видимо для Integer хеш даёт много коллизий, и для реализации стандартного TDictionary это даёт серьёзную просадку производительности при добавлении
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422364
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

TRapidDictionary не позволяет задать хеш-компаратор
Используются дефолтные и инлайнятся
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422365
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovМы боремся не с атакой на хеш. Это бред.
Мы боремся с регулярностью ключа. А это реальность.Надежней через Capacity это решить.
При условии что положение в листе ищется через n:=Value mod Capacity.

И коллизий не будет и в скорости не потеряешь.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422367
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUrgreat,

8,5 секунд
Видимо для Integer хеш даёт много коллизий, и для реализации стандартного TDictionary это даёт серьёзную просадку производительности при добавлении
Поменяй свое
Код: pascal
1.
2.
3.
4.
5.
class function InterfaceDefaults.GetHashCode_N4(Inst: Pointer; Value: Integer): Integer;
begin
  Result := Value + ((Value shr 8) * 63689) + ((Value shr 16) * -1660269137) +
    ((Value shr 24) * -1092754919);
end;



на
Код: pascal
1.
2.
3.
4.
class function InterfaceDefaults.GetHashCode_N4(Inst: Pointer; Value: Integer): Integer;
begin
  Result := Value;
end;



Проверь разницу.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422368
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUrgreat,

А в чём преимущество THashTable относительно стандартного TDictionary?
- Наличие доступа к данным через индекс в массиве словаря, а не только через ключ.
- Скорость работы мало страдает от коллизий хеша.
- Автоматическое очищение хранимых объектных типов при удалении (отключаемое).
- Возможность задания Default значения в случше ненахождения значения в словаре.
- BeginUpdates/EndUpdates для пакетного изменения.
- Режим хранения значений с дублирующимися ключами.
- Lock/Unlock/isLocked.
- Tag и прочие мелочи. :)

THashTable + альтернативные хеши?Идеала не существует. Кому что больше прет.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422369
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatПроверь разницу.
Лень
Там исходники бенчмарка открыты, посмотри, если хочешь
Вангую, что скорость будет как у TRapidGenerics
Но я считаю, предложенный тобой способ не надёжен для универсального использования. Хотя в частных случаях годится - вполне
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422370
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatAleksandr SharahovМы боремся не с атакой на хеш. Это бред.
Мы боремся с регулярностью ключа. А это реальность.Надежней через Capacity это решить.
При условии что положение в листе ищется через n:=Value mod Capacity.

И коллизий не будет и в скорости не потеряешь.

Пример.

Capacity=256*1024
Заполняем на 3/4, N=3*64*1024 элементов.
Ключи вида K=I*256, I=0..N-1.
Имеем K mod Capacity = I*256 mod (256*1024),
итого 1024 разных значения модуля,
т.е. в каждый из 1024 кластеров попадет N/1024=3*64=192 ключа
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422372
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЗавершил бенчмарки для проекта Rapid.Generics
Ни в одной из этих версий не компилируется: XE2, XE3, XE6, XE7, 10.1 Berlin. (commit: aadf2824eb9003154f5ab048092df53c4fc12c38)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422373
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUrgreatПроверь разницу.
Лень
Там исходники бенчмарка открыты, посмотри, если хочешь
Вангую, что скорость будет как у TRapidGenerics
Но я считаю, предложенный тобой способ не надёжен для универсального использования. Хотя в частных случаях годится - вполне
Не угадал.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
1. Benchmark TDictionary<Integer,Integer>
Add 10.000.000 integers. 2000 msec.
Add 10.000 integers in 10.000.000 iterations. 641 msec.
Locate 10.000 integers in 10.000.000 iterations. 500 msec.

2. Benchmark TRapidDictionary<Integer,Integer>
Add 10.000.000 integers. 422 msec.
Add 10.000 integers in 10.000.000 iterations. 172 msec.
Locate 10.000 integers in 10.000.000 iterations. 125 msec.

3. Benchmark TRapidDictionary<Integer,Integer> Modified.
Add 10.000.000 integers. 359 msec.
Add 10.000 integers in 10.000.000 iterations. 140 msec.
Locate 10.000 integers in 10.000.000 iterations. 94 msec.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422375
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovПример.

Capacity=256*1024
Заполняем на 3/4, N=3*64*1024 элементов.
Ключи вида K=I*256, I=0..N-1.
Имеем K mod Capacity = I*256 mod (256*1024),
итого 1024 разных значения модуля,
т.е. в каждый из 1024 кластеров попадет N/1024=3*64=192 ключаОпять частный случай.
Сделай ключ I*255 или I*257 и проблема исчезает.

Как я уже сказал подобрать правило можно под любой хэш в таблице с открытой адресацией.
Перебор разных хешей это не более чем игры в угадайку.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422376
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя про "коллизий не будет" это я глупость сказал, конечно. Не подумавши.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422381
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatНе угадал.

Не :)
Я имел ввиду, если ты InterfaceDefaults.GetHashCode_N4 подменишь

А вообще буст виден, согласен. Только я на такое в универсальной либе так и не решусь :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422382
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOUЗавершил бенчмарки для проекта Rapid.Generics
Ни в одной из этих версий не компилируется: XE2, XE3, XE6, XE7, 10.1 Berlin. (commit: aadf2824eb9003154f5ab048092df53c4fc12c38)

У меня как раз XE8 :)
А что ругается? Internal error?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422459
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUБлин, хотел модуль Шарахова добавить, а UnicodeString нет, RawByteString-таблица основана на поле в обжекте
Нет, хватит париться )

Жаль, что твоя гнедая сломала ногу )

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

Во-вторых, ты ж понимаешь, что разницы между UnicodeString и RawByteString в данном нашем случае нет никакой,
все особенности легко учитываются внутри хеш-функции.

В-третьих, чтобы использовать "поле в обжекте" достаточно умения работать с указателями.

В общем добавил немного отсебятины в твой код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
uses
  ShaDictionaries;

...

var
  arr: array of RawByteString;

procedure ShaPrepare;
var
  Len, i, j, Seed: Integer;
begin;
  SetLength(arr, ITEMS_COUNT);
  Randomize; Seed:=RandSeed;
  for i := 0 to ITEMS_COUNT-1 do begin;
    Len := 5 + Random(8);
    SetLength(arr[i], Len);
    for j := 1 to Len do arr[i][j] := AnsiChar(Ord('A') + Random(Ord('Z') - Ord('A') + 1));
    end;
  RandSeed:=Seed;
  end;

procedure ShaRun;
const
  ITERATIONS_COUNT = 10;
  MODES: array[0..2] of string = ('Add', 'Add+Capacity', 'Items');
  CAPACITIES: array[0..2] of Integer = (0, ITEMS_COUNT, ITEMS_COUNT);
var
  i, cnt, Mode: integer;
  Time: cardinal;
  d: TShaNamedObjectDictionary;
  p: pointer;
begin;
  for Mode := Low(MODES) to High(MODES) do begin;
    Write('TShaNamedObjectDictionary ', MODES[Mode], '... ');
    if Mode<>2 then begin;
      Time:=GetTickCount;
      for cnt:=1 to ITERATIONS_COUNT do begin;
        d:=TShaNamedObjectDictionary.Create(CAPACITIES[Mode], false, 0);
        for i:=0 to Length(arr)-1 do d.Add(arr[i], @arr[i]);
        d.Free;
        end;
      Time := GetTickCount - Time;
      end
    else begin;
      d:=TShaNamedObjectDictionary.Create(CAPACITIES[Mode], false, 0);
      for i:=0 to Length(arr)-1 do d.Add(arr[i], @arr[i]);
      Time:=GetTickCount;
      for cnt:=1 to ITERATIONS_COUNT do for i:=0 to Length(arr)-1 do p:=d.Objects[arr[i]];
      Time := GetTickCount - Time;
      d.Free;
      if p<>@arr[Length(arr)-1] then Write(' *not found* ');
      end;
    Writeln(Time, 'ms');
    end;
  end;

begin
  try
    ShaPrepare;
    ShaRun;
...



скомпилировал на XE8 и прогнал на E6850, результаты ниже:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
TShaNamedObjectDictionary Add... 1357ms
TShaNamedObjectDictionary Add+Capacity... 1123ms
TShaNamedObjectDictionary Items... 982ms

string
TRunner<System.string>.SystemSystem Add... 4976ms
TRunner<System.string>.SystemSystem Add+Capacity... 3042ms
TRunner<System.string>.SystemSystem Items... 1513ms
TRunner<System.string>.SystemRapid Add... 4664ms
TRunner<System.string>.SystemRapid Add+Capacity... 2699ms
TRunner<System.string>.SystemRapid Items... 1185ms
TRunner<System.string>.RapidRapid Add... 1904ms
TRunner<System.string>.RapidRapid Add+Capacity... 1591ms
TRunner<System.string>.RapidRapid Items... 1030ms
TRunner<System.string>.RapidDictionary Add... 2028ms
TRunner<System.string>.RapidDictionary Add+Capacity... 1716ms
TRunner<System.string>.RapidDictionary Items... 1155ms



женерики наше все.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422471
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovВо-первых, заметил небольшую неточность.
Тест на время заполнения учитывает время создания словаря и время заполнения, но не учитывает время освобождения.
Учел.
Не совсем понял, что ты имеешь ввиду
Операцию Delete или Clear?
Delete показала бы превосходство моего кода, но Delete происходит редко, поэтому я решил не добавлять в тест
Clear тоже не медленнее... на Integer разницы быть не должно, для string разница незначительна. Хотя... в оригинале вроде виртуальные калбеки дёргаются, я уже не помню

Aleksandr SharahovВо-вторых, ты ж понимаешь, что разницы между UnicodeString и RawByteString в данном нашем случае нет никакой,
все особенности легко учитываются внутри хеш-функции.
Не понятно, это ты к чему?
Я не против RawByteString :)

Aleksandr SharahovВ-третьих, чтобы использовать "поле в обжекте" достаточно умения работать с указателями.
Что-то я не понял. А к чему тогда поле Offset?

Aleksandr SharahovВ общем добавил немного отсебятины в твой код:
скомпилировал на XE8 и прогнал на E6850, результаты ниже:
женерики наше все.
Так ты RawByteString и UnicodeString похоже сравниваешь. Во втором в 2 раза больше байт
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422475
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovRandomize; Seed:=RandSeed;
Сначала надо Seed сохранять, потом рандомайзить )
Ну и потом здесь специально нет рандомайза, чтобы сохранить одинаковость данных
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422482
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUAleksandr SharahovВо-первых, заметил небольшую неточность.
Тест на время заполнения учитывает время создания словаря и время заполнения, но не учитывает время освобождения.
Учел.
Не совсем понял, что ты имеешь ввиду

Я Instance.Free имею в виду
У тебя так:
Код: pascal
1.
2.
3.
4.
        Time := GetTickCount;
        Instance := TestClass.Create(Items, CAPACITIES[Mode]);
        Time := GetTickCount - Time;
        Instance.Free;



логичее было бы так
Код: pascal
1.
2.
3.
4.
        Time := GetTickCount;
        Instance := TestClass.Create(Items, CAPACITIES[Mode]);
        Instance.Free;
        Time := GetTickCount - Time;



SOFT FOR YOUAleksandr SharahovВ-третьих, чтобы использовать "поле в обжекте" достаточно умения работать с указателями.
Что-то я не понял. А к чему тогда поле Offset?


Offset - это смещение поля внутри объекта или записи. В нашем тесте запись состоит из одного единственного строкового поля. Offset=0.

SOFT FOR YOUТак ты RawByteString и UnicodeString похоже сравниваешь. Во втором в 2 раза больше байт
Разумеется, но у нас с тобой хеш-функции не блобы обрабатывают, а строки посимвольно, т.е. на них это не влияет, т.к. количество операций одинаково.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422483
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUAleksandr SharahovRandomize; Seed:=RandSeed;
Сначала надо Seed сохранять, потом рандомайзить )
Ну и потом здесь специально нет рандомайза, чтобы сохранить одинаковость данных

Ты бы разобрался сначала.

Так сделано, чтобы генератор крутился с одного значения и у тебя и у меня.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422488
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovРазумеется, но у нас с тобой хеш-функции не блобы обрабатывают, а строки посимвольно, т.е. на них это не влияет, т.к. количество операций одинаково.
Ну у меня данные обрабатываются не посимвольно, а группами байт
И потом ты забываешь про компаратор и кеш-мисс
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422489
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUAleksandr SharahovРазумеется, но у нас с тобой хеш-функции не блобы обрабатывают, а строки посимвольно, т.е. на них это не влияет, т.к. количество операций одинаково.
Ну у меня данные обрабатываются не посимвольно, а группами байт
И потом ты забываешь про компаратор и кеш-мисс

Ну, все в твоих руках, напиши женерик для Raw )

Я не забываю, я на этом как раз играю в своем словаре.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422490
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Aleksandr Sharahov]SOFT FOR YOUНу, все в твоих руках, напиши женерик для Raw )
Я не забываю, я на этом как раз играю в своем словаре.
Так у меня есть и RawByteString, и DynamicArray, и структуры, и всё что хочешь :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422492
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUИ потом ты забываешь про компаратор и кеш-мисс
В твоих тестах строковый компарер не отрабатывает по данным.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422493
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Отрабатывает
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422494
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

У тебя же там один массив под ключи. И когда ты ищешь все ключи, то фактически, у одинаковых строк сравниваются только адреса.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422496
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOU,

У тебя же там один массив под ключи. И когда ты ищешь все ключи, то фактически, у одинаковых строк сравниваются только адреса.
Обижаешь :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422499
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUОбижаешь :)
Где я могу увидеть создание копий ключей?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422500
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Замена string на RawByteString не добавила скорости твоему словарю:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
TShaNamedObjectDictionary Add... 1342ms
TShaNamedObjectDictionary Add+Capacity... 1123ms
TShaNamedObjectDictionary Items... 983ms

RawByteString
TRunner<System.RawByteString>.SystemSystem Add... 4617ms
TRunner<System.RawByteString>.SystemSystem Add+Capacity... 2824ms
TRunner<System.RawByteString>.SystemSystem Items... 1326ms
TRunner<System.RawByteString>.SystemRapid Add... 4430ms
TRunner<System.RawByteString>.SystemRapid Add+Capacity... 2606ms
TRunner<System.RawByteString>.SystemRapid Items... 1107ms
TRunner<System.RawByteString>.RapidRapid Add... 1810ms
TRunner<System.RawByteString>.RapidRapid Add+Capacity... 1529ms
TRunner<System.RawByteString>.RapidRapid Items... 983ms
TRunner<System.RawByteString>.RapidDictionary Add... 1918ms
TRunner<System.RawByteString>.RapidDictionary Add+Capacity... 1607ms
TRunner<System.RawByteString>.RapidDictionary Items... 1060ms
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422502
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виноват, *почти* не добавила
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422505
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOUОбижаешь :)
Где я могу увидеть создание копий ключей?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function Test: Integer;
var
  Dictionary: TRapidDictionary<string,Integer>;
begin
  Dictionary := TRapidDictionary<string,Integer>.Create;
  try
    Dictionary.Add('1', 1);
    Result := Dictionary[IntToStr(1)];
  finally
    Dictionary.Free;
  end;
end;



Если бы сравнивались только указатели, то в данном случае был бы Exception
А посмотреть - только трейсить
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422506
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovЗамена string на RawByteString не добавила скорости твоему словарю:
Любопытно, я посмотрю
А ты точно в Release сравниваешь?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422508
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUAleksandr SharahovЗамена string на RawByteString не добавила скорости твоему словарю:
Любопытно, я посмотрю
А ты точно в Release сравниваешь?

На самом деле небольшое ускорение есть, но все равно моя чуточку быстрее, т.к. не хранит "лишних" данных.

Точно релиз.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422509
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Значит я посмотрю
Возможно под x86 имеет смысл использовать стандартный ассемблерный компаратор строк, а не мой самописный
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422510
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЕсли бы сравнивались только указатели, то в данном случае был бы Exception
А посмотреть - только трейсить
У тебя сохранены строки в Items. Cтроки у нас рефкаунтед, а потому там сохранены только указатели. Когда ты вставляешь данные в словарь, то словарь сохраняет строковый ключ и тоже как указатель. Когда ты в поиске даёшь словарю сохранённую в Items строку, то фактически ты передаёшь уже сохранённый адрес. Компарер видя что адреса сравниваемых строк совпадают дальнейшее сравнение не делает. Так понятно?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422511
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

В Items есть Key: TKey
Он конечно указатель, но обычный string в соответствующем случае
Если указатели string совпадают - то строки равны. А ты как хотел?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422513
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUЕсли указатели string совпадают - то строки равны. А ты как хотел?
Для корректности поиск нужно делать по копиям ключей, чтобы дать возможность отрабатывать компареру, как это происходило бы в реальных сценариях.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422519
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeySOFT FOR YOUЕсли указатели string совпадают - то строки равны. А ты как хотел?
Для корректности поиск нужно делать по копиям ключей, чтобы дать возможность отрабатывать компареру, как это происходило бы в реальных сценариях.

Очень интересная мысль
Наверное, действительно нужно предусмотреть отдельный вариант теста с уникальными строками

Но:
1) Стандартный компаратор тоже сравнивает указатели
2) Значит дело не в компараторе x86, а в чём-то другом. Не может у Шарахова поиск по хешу работать быстрее моего :)
Но может быть действительно дело в архитектуре, том факте, что память расходуется больше
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422521
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SOFT FOR YOUНе может у Шарахова поиск по хешу работать быстрее моего
Самоуверенность просто прёт !
Когда библиотеки Шарахова использовались, ты ещё сиську сосал, и к его коду доверия гораздо больше, чем к коду всемирного оптимизатора.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422548
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил в свой тест ShaDictionary

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
1. Benchmark TArrayEx<Integer>
Add 10.000.000 integers. 594 msec. 32 msec (optimised).
Add 10.000 integers in 10.000.000 iterations. 718 msec.
Locate 10.000 integers in 10.000.000 iterations. 719 msec.

2. Benchmark THashTable<Integer,Integer>
Add 10.000.000 integers. 1860 msec. 672 msec (optimised).
Add 10.000 integers in 10.000.000 iterations. 281 msec.
Locate 10.000 integers in 10.000.000 iterations. 266 msec.

3. Benchmark TDictionary<Integer,Integer>
Add 10.000.000 integers. 2109 msec.
Add 10.000 integers in 10.000.000 iterations. 656 msec.
Locate 10.000 integers in 10.000.000 iterations. 531 msec.

4. Benchmark TRapidDictionary<Integer,Integer>
Add 10.000.000 integers. 453 msec.
Add 10.000 integers in 10.000.000 iterations. 172 msec.
Locate 10.000 integers in 10.000.000 iterations. 140 msec.

5. Benchmark TShaObjectDictionary
Add 10.000.000 integers. 1375 msec.
Add 10.000 integers in 10.000.000 iterations. 282 msec.
Locate 10.000 integers in 10.000.000 iterations. 250 msec.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422561
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

а где можно скачать исходники?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422565
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422585
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я в свой тест добавил TShaNamedObjectDictionary

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
RawByteString
TRunner<System.RawByteString>.Sha Add... 686ms
TRunner<System.RawByteString>.Sha Add+Capacity... 577ms
TRunner<System.RawByteString>.Sha Items... 468ms
TRunner<System.RawByteString>.RapidRapid Add... 764ms
TRunner<System.RawByteString>.RapidRapid Add+Capacity... 639ms
TRunner<System.RawByteString>.RapidRapid Items... 515ms
TRunner<System.RawByteString>.RapidDictionary Add... 748ms
TRunner<System.RawByteString>.RapidDictionary Add+Capacity... 577ms
TRunner<System.RawByteString>.RapidDictionary Items... 453ms



rgreat,

Кстати я нашёл баг конструктора, про который ты говорил
Фиг знает, почему в одних случай конструктор класса происходит, а в других нет
В общем исправил, обновил файл в репозитории
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422588
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Я так и не понял, у тебя в хеш-таблице есть возможность создать <RawByteString,Integer>, например?
Или для хранения Integer должен быть какой-то отдельный массив?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422640
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatAleksandr Sharahov,

http://www.rgreat.ru/tmp/Delphi/Test.zip

Посмотрел, есть несколько предложений:

1. Тесты с целочисленными ключами работают с неодинаковыми случайными данными
из-за того, что в начале каждого теста RandSeed имеет разные значения. Исправление:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
    Randomize; Seed:=RandSeed;
    if TestIntegers then begin
      RandSeed:=Seed; TArrayExTestInteger;
      RandSeed:=Seed; THashTableTestInteger;
      RandSeed:=Seed; TDictionaryTestInteger;
      RandSeed:=Seed; TRapidDictionaryTestInteger;
      RandSeed:=Seed; TShaDictionaryTestInteger;
      RandSeed:=Seed; TShaBoxTestInteger;
    end;



2. Мои словари используют взбалтывание идентификаторов, из-за чего работают в неравных условиях с другими.
Переделал, теперь это опция, по умолчанию отключенная. Для сравнимости результатов лучше использовать
обновленные исходники к статье http://guildalfa.ru/alsha/node/32

3. По аналогии добавил замеры скорости для TShaIntegerBox:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
procedure TShaBoxTestInteger;
type
  TDict = ShaDictionaries.TShaIntegerBox;
var
  A : TDict;
  i : Integer;
  T : Cardinal;
const
  SearchVal = 5;
begin
  WriteHeader('Benchmark '+PTypeInfo(TypeInfo(TDict)).Name);

  A:=TDict.Create;
  try
    Write('Add 10.000.000 integers. ');
    T:=GetTickCount;
    for i:=0 to 9999999 do begin
      A.Add(i);
    end;
    T:=GetTickCount-T;
    WriteLn(IntToStr(T)+' msec.');

    A.Clear;
    Write('Add 10.000 integers in 10.000.000 iterations. ');
    T:=GetTickCount;
    for i:=0 to 9999999 do begin
      A.Add(Random(10000));
    end;
    T:=GetTickCount-T;
    WriteLn(IntToStr(T)+' msec.');

    Write('Locate 10.000 integers in 10.000.000 iterations. ');
    T:=GetTickCount;
    for i:=0 to 9999999 do begin
      A.Find(Random(10000));
    end;
    T:=GetTickCount-T;
    WriteLn(IntToStr(T)+' msec.');

  finally
    A.Free;
  end;
end;




После этих изменений на E6850 получил:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Add 10.000.000 integers. 952 msec. 46 msec (optimised).
Add 10.000 integers in 10.000.000 iterations. 1154 msec.
Locate 10.000 integers in 10.000.000 iterations. 1155 msec.

2. Benchmark THashTable<Integer,Integer>
Add 10.000.000 integers. 3042 msec. 1123 msec (optimised).
Add 10.000 integers in 10.000.000 iterations. 484 msec.
Locate 10.000 integers in 10.000.000 iterations. 452 msec.

3. Benchmark TDictionary<Integer,Integer>
Add 10.000.000 integers. 3089 msec.
Add 10.000 integers in 10.000.000 iterations. 1014 msec.
Locate 10.000 integers in 10.000.000 iterations. 811 msec.

4. Benchmark TRapidDictionary<Integer,Integer>
Add 10.000.000 integers. 936 msec.
Add 10.000 integers in 10.000.000 iterations. 327 msec.
Locate 10.000 integers in 10.000.000 iterations. 250 msec.

5. Benchmark TShaObjectDictionary
Add 10.000.000 integers. 655 msec.
Add 10.000 integers in 10.000.000 iterations. 203 msec.
Locate 10.000 integers in 10.000.000 iterations. 140 msec.

6. Benchmark TShaIntegerBox
Add 10.000.000 integers. 562 msec.
Add 10.000 integers in 10.000.000 iterations. 187 msec.
Locate 10.000 integers in 10.000.000 iterations. 141 msec.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422642
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUА я в свой тест добавил TShaNamedObjectDictionary

Мои словари используют взбалтывание идентификаторов, из-за чего работают в неравных условиях с другими.
Переделал, теперь это опция, по умолчанию отключенная. Для сравнимости результатов лучше использовать
обновленные исходники к статье http://guildalfa.ru/alsha/node/32


SOFT FOR YOUAleksandr Sharahov,
Я так и не понял, у тебя в хеш-таблице есть возможность создать <RawByteString,Integer>, например?
Или для хранения Integer должен быть какой-то отдельный массив?

У меня элементы хеш-таблицы содержат только два поля: хеш-код и адрес данных.

Если ты хочешь хранить в хеш-таблице адреса объектов или записей,
которые имеют поля RawByteString, Integer и/или любые другие,
то, разумеется, они должны находиться где-то в памяти вне таблицы.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422659
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Сурово
У тебя вызываются калбеки на хеш и компаратор строки. У меня они инлайнятся, кроме того хеш сначала считается четверками байт.
Как ты думаешь, почему производительность может уступать?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422672
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUAleksandr Sharahov,

Сурово
У тебя вызываются калбеки на хеш и компаратор строки. У меня они инлайнятся, кроме того хеш сначала считается четверками байт.
Как ты думаешь, почему производительность может уступать?

При случайном доступе к элементам хеш-таблицы производительность определяется, в первую очередь, количеством элементов таблицы, которое помещается в кеш-линии.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422677
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Т.е. если количество элементов будет таким, что все они поместятся в L1, у меня станет быстрее?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422686
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТ.е. если количество элементов будет таким, что все они поместятся в L1, у меня станет быстрее?

Не в этом дело.
Искомый элемент хеш-таблицы может иметь индекс, отличающийся от предсказанного.
В этом случае придется последовательно прочитать данные из нескольких кеш-линий.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422694
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Надо конечно проанализировать коллизии, но, насколько я помню, их было не много
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422717
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

А есть у твоей реализации ещё какие-то преимущества над стандартным TDictionary? Кроме урезания данных
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422724
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUAleksandr Sharahov,

А есть у твоей реализации ещё какие-то преимущества над стандартным TDictionary? Кроме урезания данных

Разумеется, вот те, что мне нравятся:
- скорость,
- удобство,
- единообразное использование,
- размер и понятность кода,
- отсутствие ненужных мне функций,
- простота изменения под себя.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422729
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Мягко говоря аргументы спорные
Но меня интересует именно производительность
Есть ли особенности, кроме урезания размера рабочих структур, которые позволяют увеличить производительность относительно стандартной TDictionary?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422732
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUНо меня интересует именно производительность
Есть ли особенности, кроме урезания размера рабочих структур, которые позволяют увеличить производительность относительно стандартной TDictionary?

Разумеется, есть неиспользованные возможности.
Например, производительность можно дополнительно увеличить инлайнами и всякой другой хренью, ну, ты понял )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422736
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Ясно :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422749
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahovпонятность кода,
Смотрю я на твою функцию ShiftItems и понятность от меня уплывает. :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39422774
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatAleksandr Sharahovпонятность кода,
Смотрю я на твою функцию ShiftItems и понятность от меня уплывает. :)

Если не читал статью, то да, может быть непонятно.

Там всего 3 идеи при сдвиге:
1. не делать лишнего,
2. не нарушить упорядоченность,
3. учесть заворот данных при выходе за границу массива.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39423128
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

А чего ты застрял на семёрке?
Давно делают юникод и шаблоны
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39432362
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подписался на этот поисковый "сериал", очень интересно. Лучшее после "теории большого взрыва" :)

А если для ускорения поиска модифицировать сам строковый класс?
Чтобы часть данных уже была заранее в строке посчитана? Память не жалко. Жалко время.
И даже каким-то боком попробовать сюда фильтр Блума прикрутить?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39432379
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODEПодписался на этот поисковый "сериал", очень интересно. Лучшее после "теории большого взрыва" :)

А если для ускорения поиска модифицировать сам строковый класс?
Чтобы часть данных уже была заранее в строке посчитана? Память не жалко. Жалко время.
И даже каким-то боком попробовать сюда фильтр Блума прикрутить?

Ничего модифицировать не надо. Такая возможность уже есть из коробки.
Достаточно один раз вычислить хеш строки и хранить его рядом со строкой в самом "объектовом" классе.
После чего можно использовать protected методы: AddHashed, PutHashed, FindHashed, GetHashed, ExtractHashed, RemoveHashed.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39432380
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODE,

Так сериал к концу подошёл. В универсальном случае можно заменить стандартную библиотеку шаблонов на мою. В особых случаях можно реализовать решение на основе кода Шарахова, только заинлайнить хешер и компаратор.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39432390
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Прочитал, пора попробовать :)
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39436922
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, я всё-таки продал душу дьяволу :)
Можете посмотреть коммит, не забудьте нажать "Load diff" :)
https://github.com/d-mozulyov/Rapid.Generics/commit/6ca71f1b37b493ffd3a8c4af092ec8a47a795aa7

Есть поддержка Delphi 2010 и XE4+
Завести Delphi 2009 и XE1-XE3 так и не удалось

Гордо дублирую таблицы бенчмарков:





...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39439171
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправил баг с итераторами
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39443670
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,
Да, много работы проделано.
Жаль, что у меня XE 3 и поэтому - у меня не работает (а другую версию я уже, наверно, никогда не куплю).
В какую сторону "копать" для того, чтобы "завелось"? Или там какие-то принципиальные ограничения?

От комментов как-то специально чистили код?
Ну, я по себе сужу: я не могу так "мочаливо" писать.
Всегда для себя, (чтобы не забыть) подробно комментирую не только ЧТО, но и ПОЧЕМУ делаю именно так.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39443671
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ART-CODEОт комментов как-то специально чистили код?

Там код писался не для понимания другими, а для чтобы "быстрее всех в мире"
Лишний комментарий - снижение быстродействия !
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39443737
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODE,

Я обычно комментирую много, а тут видимо всё относительно просто, поэтому комментариев по минимуму
Изначально либа компилировалась только под XE8, потом пришлось вымучивать код, чтобы компилятор его смог прожевать. Причём заметь, под D2010 компилируется, а под XE1-3 уже нет, хотя используется в точности один и тот же код

Связано это с тем, что мало кто пишет дженериковые библиотеки, и стандартной обычно хватает, а те дженерики, что пишутся, обычно просты. Соответственно компилер не протестировали как следует и на данном коде он выдаёт Internal Error. Самые глючные подходы - это метки, локальные типы и локальные структуры без объявленого типа. То есть официально поддерживаться должно, а рушит почти каждый компилятор.

Я конечно ещё сделаю заход на XE1-3. Но вообще рекомендую обновиться. Начиная с XE8 уже что-то удобоваримое и работать будет быстрей
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39445792
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавлена полная поддержка Weak Reference, исправлена пара багов
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39446462
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На нашей улице снова праздник!
Удалось сделать сборку для XE1-XE3
Таким образом поддерживаются все версии, начиная с 2010
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39446482
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
Код: pascal
1.
2.
3.
4.
5.
6.
  for i := 0 to ITEMS_COUNT-1 do begin;
///...
  for Mode := Low(MODES) to High(MODES) do begin;
///...
    else begin;
///...



Оффтоп. Простите, а выделенное - это религия? Я понимаю, что каждый делает, как хочет. Но вижу такое впервые.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39446558
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

Я думаю у Шарахова маленький монитор и он работает не в команде. У нас за такое больно бьют по рукам )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39446589
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд, да это религия. История корнями уходит. Если не устраивает, удаляется одной заменой.

SOFT FOR YOUЯ думаю у Шарахова маленький монитор и он работает не в команде. У нас за такое больно бьют по рукам )

Ошибаешься оба раза. В вашей команде пора начать бить по голове )
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39446802
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU ,
Спасибо, теперь компилируется.
Хотя и пишет: "The library is much faster in XE7+ versions."
Результат теста во вложении.
Windows 8.1x64. 12Gb
i7-4710HQ - 2.50GHz
---
Я так понимаю, что чтобы работать на полной скорости - мне придется у кого-то (у кого есть XE10)
скомпилировать DLL с набором функций, и далее смогу использовать ее где угодно.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39446807
ART-CODE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В прошлом сообщении были результаты сборки Debug (по ошибке присоединил).
Вот результат Release:
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39446870
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ART-CODE,

Насчёт версий и скорости
Грамотность компилятора в плане версий развивалась постепенно

1) inline. Некоторые методы, особенно в TStack, TQueue и TRapidDicictionary, обозначены как inline. Но вроде бы до версии XE5 методы категорически отказывались инлайниться
2) Константный SizeOf. Код изобилует надписями типа if SizeOf() and 2 <> 0, case SizeOf() of и другими. Начиная вроде бы с версии XE4, все эти записи существенно сокращаются и выполняется только какой-то конкретный код, а до этого код раздувается до огромных размеров
3) Умный тип. Начина с XE7 в язык внедрены классные фишки. Можно "инлайном" определить, является ли тип Managed. Или разновидность типа. На этой концепции построен, например, TRapidDictionary. Там "инлайном" определяется разновидность типа, и для строк применяется один хеш/компаратор, для объектов другой, для чисел - третий. Правда в XE7 проблемы с label (метками), поэтому TRapidDictionary один фиг работает как TDictionary. Поэтому начиная с XE8 норм, а дальше улучшений я не заметил

Что до dll - да. Но мне кажется, лучше в dll выносить не отдельные команды, а комплексные. ну там какие-то высокоуровневые функции, не знаю, какая у тебя специфика ). В общем, твори
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39494927
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На одном другом известном форуме :) возникла необходимость в работе со словарем с бинарными ключами.

В результате мой юнит пополнился еще один классом.

В связи с этим и не только внес изменения в статейку "Хеширование и хеш-таблицы" по адресу http://guildalfa.ru/alsha/node/32

Плюс кое-что добавлено, в частности:
- добавил Murmur3Hash (для строки и буфера),
- добавил версию ShaPerfectHash для буфера,
- радикально ускорил ShaPerfectHash.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39494935
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Murmur3Hash - это сразу 6+!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39494961
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамMurmur3Hash - это сразу 6+! Поясни, что развеселило?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39494972
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Название классное.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39494975
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где-то есть сравнительное тестирование Murmur2/3
с другими хеш-функциями (Дженкинс, Адлер и др.)?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39495030
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

В статье ничего не нашёл про Murmur3Hash/ShaPerfectHash
Пробовал ли ты мой хеш с обработкой 4 байт за итерацию?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39495070
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUAleksandr Sharahov,

В статье ничего не нашёл про Murmur3Hash/ShaPerfectHash
Пробовал ли ты мой хеш с обработкой 4 байт за итерацию?

Значит, смотрел по диагонали. Есть и в статье немного, и в исходниках.

Твой хеш не пробовал, т.к. не было особой надобности:

Murmur3 один из самых быстрых качественных хешей общего назначения.
Мой всего на 10% медленней, но отлично подходит для текстовых ключей в хеш-таблицах.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39495102
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUПробовал ли ты мой хеш с обработкой 4 байт за итерацию?
Я пробовал. На 6% лучше Седжвика на рандомных ключах и на 11% хуже на последовательных.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39495218
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Какова длинна ключей?
И какой толк от тестирования последовательных сороковых ключей?
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39495239
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUКакова длинна ключей?
Рандомные - строковые GUID's.

SOFT FOR YOUИ какой толк от тестирования последовательных сороковых ключей?
Смысл в выявлении слабых мест.
...
Рейтинг: 0 / 0
TDictionary или TList<>.BinarySearch с позиции поиска
    #39495241
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyРандомные - строковые GUID's.
...последовательные IntToStr(1) ... IntToStr(1000000).
...
Рейтинг: 0 / 0
479 сообщений из 479, показаны все 20 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TDictionary или TList<>.BinarySearch с позиции поиска
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]