powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Производительность TDictionary
60 сообщений из 60, показаны все 3 страниц
Производительность TDictionary
    #39805114
Swv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

навострячил тут LRU простенький как часть более крупной задачи.
HashMap и список. HashMap на TDictionary<integer,TMyClass>

в задаче понатыкано счетчиков производительности. заместо AQtime )
И получилось, что очень большую часть времени отъедает LRU.
Начала смотреть и все уперлось в TDictionary

А точнее в map.ContainsKey(key) и в node:=map[key];

статистика по LRU примерно такая. Время в секундах

lru.get только hashmap 0,648279488394491 (map.ContainsKey(key) и node:=map[key])
lru.get только все остальное 0,408678524370626
lru.put 0,00645377100622397
get counter 3315095
put counter 7185

Собственно вопрос. А можно как то ускорить?) или это предел для TDictionary и вообще для hashmap?
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39805116
Swv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вернее даже так

lru.get только hashmap 0,961819743242614
lru.get только все остальное 0,159336854435245
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39805122
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замени TEqualityComparer на свой.

Код: 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.
type

  TIntComp = class(TInterfacedObject, IEqualityComparer<integer>)
    function Equals(const Left, Right: integer): Boolean;
    function GetHashCode(const Value: integer): Integer;
  end;

  TStringComp = class(TInterfacedObject, IEqualityComparer<string>)
    function Equals(const Left, Right: string): Boolean;
    function GetHashCode(const Value: string): Integer;
  end;

{ TIntComp }

function TIntComp.Equals(const Left, Right: integer): Boolean;
begin
  Result:=Left=Right;
end;

function TIntComp.GetHashCode(const Value: integer): Integer;
begin
  Result:=Value;
end;

{ TStringComp }

function TStringComp.Equals(const Left, Right: string): Boolean;
begin
  Result:=Left=Right;
end;

{$OverFlowChecks OFF}
function TStringComp.GetHashCode(const Value: string): Integer;
var
  a : Integer;
  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;
{$OverFlowChecks On}



Далее:
Код: pascal
1.
2.
  IntDict:=TDictionary<integer,TMyClass>.Create(TIntComp.Create);
  StringDict:=TDictionary<string,TMyClass>.Create(TStringComp.Create);



Разница:

default1. Benchmark TDictionary<Integer,Integer>
Add 10.000.000 integers. 1907 msec.
Add 10.000 integers in 10.000.000 iterations. 500 msec.
Locate 10.000 integers in 10.000.000 iterations. 422 msec.

2. Benchmark TDictionary<string,Integer>
Add 1.000.000 GUIDs. 515 msec.
Add 150844 strings in 10.000.000 iterations. 2016 msec.
Locate 150844 strings in 10.000.000 iterations. 1875 msec.

custom1. Benchmark TDictionary<Integer,Integer>
Add 10.000.000 integers. 468 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. 375 msec.
Add 150844 strings in 10.000.000 iterations. 1656 msec.
Locate 150844 strings in 10.000.000 iterations. 1547 msec.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39805124
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
procedure TDictionaryTestInteger;
type
  TDict = Generics.Collections.TDictionary<integer,integer>;
var
  A : TDict;
  i : Integer;
  T : Cardinal;
const
  SearchVal = 5;
begin
  WriteHeader('Benchmark '+PTypeInfo(TypeInfo(TDict)).Name);
  RandSeed:=Seed;

  A:=TDict.Create(TIntComp.Create);
  try
    Write('Add 10.000.000 integers. ');
    T:=GetTickCount;

    for i:=0 to 9999999 do begin
      A.Add(i,0);
    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.AddOrSetValue(Random(10000),0);
    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.ContainsKey(Random(10000));
    end;
    T:=GetTickCount-T;
    WriteLn(IntToStr(T)+' msec.');

  finally
    A.Free;
  end;
end;

procedure TDictionaryTestString;
type
  TDict = Generics.Collections.TDictionary<String,integer>;
var
  A : TDict;
  i : Integer;
  T : Cardinal;
const
  SearchVal = 5;
begin
  WriteHeader('Benchmark '+PTypeInfo(TypeInfo(TDict)).Name);
  RandSeed:=Seed;

  A:=TDict.Create(TStringComp.Create);
  try
    Write('Add 1.000.000 GUIDs. ');
    T:=GetTickCount;
    for i:=0 to 999999 do begin
      A.Add(List1[i],i);
    end;
    T:=GetTickCount-T;
    WriteLn(IntToStr(T)+' msec.');

    A.Clear;
    Write('Add '+IntToStr(List2.Count)+' strings in 10.000.000 iterations. ');
    T:=GetTickCount;
    for i:=0 to 9999999 do begin
      A.AddOrSetValue(List2[Random(List2.Count)],0);
    end;
    T:=GetTickCount-T;
    WriteLn(IntToStr(T)+' msec.');

    Write('Locate '+IntToStr(List2.Count)+' strings in 10.000.000 iterations. ');
    T:=GetTickCount;
    for i:=0 to 9999999 do begin
      A.ContainsKey(List2[Random(List2.Count)]);
    end;
    T:=GetTickCount-T;
    WriteLn(IntToStr(T)+' msec.');
  finally
    A.Free;
  end;
end;
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39805235
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat, а какова частота коллизий твоего хэша?
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39805323
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да мне пофигу. Меня результат тестов устраивает.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39805378
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbrgreat, а какова частота коллизий твоего хэша?
Это хеш Седжвика (RSHASH). Тут есть данные о коллизиях .
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39805582
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вангую, что RS HASH это Robert Sedgewick. Но на дельфях он не писал ведь...
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39805893
rashid.abzalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806227
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashid.abzalov,

с тех пор TDictionary afaik стал лучше
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806251
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonс тех пор TDictionary afaik стал лучше
Да нифига. Хотя, конкретно эта проблема, решается на текущей реализации словаря, буквально, несколькими строчками.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806253
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...ну, то есть, чуть лучше, конечно стал, но в целом, всё по-прежнему.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806377
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, меняя хэш-функцию?
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806408
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbKazantsev Alexey, меняя хэш-функцию?
Нет, достаточно добавить случайный seed в компарер. Это поможет даже если будет использоваться очень простая хеш-функция. А у используемого Дженкинса можно указать initial value.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806748
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, а где здесь используется Seed?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
{$OverFlowChecks OFF}
function TStringComp.GetHashCode(const Value: string): Integer;
var
  a : Integer;
  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;
{$OverFlowChecks On}




если только a:=Seed;
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806800
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Седжвика можно модифицировать так: Result := Seed; Только seed должен быть результатом предыдущего хеширования этой-же функцией. То есть, выглядеть это может примерно так:
Код: pascal
1.
2.
3.
4.
5.
6.
function RSHash(Const AData; ASize : Integer; ASeed : Integer = 0) : Integer;
begin
 Result := ASeed;
...

end;


В констркторе компарера:
Код: pascal
1.
FSeed := RSHash(RandomData, RandomDataSize);


В GetHashCode компарера:
Код: pascal
1.
 Result := RSHash(Pointer(AString)^, Length(AString) * SizeOf(Char), FSeed);


Этот вариант решит проблему обозначенную в статье, но, от атаки hash-flooding не защитит. Аналогичные манипуляции для Дженкинса избавят и от hash-flooding.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806805
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если уж важна защита от флуда менять надо a:=a*378551;
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806809
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Рандомно менять эти коэффициенты чревато ростом коллизий.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806932
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Меняйте через формулу, из простых чисел большого размера.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806937
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

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

Сделать функцию генеряющую простое число от рандома - это проблема?
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806941
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Сколько таких простых чисел будет в результате?
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806983
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Достаточно.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806985
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
~5% от maxint - вполне достаточно.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39806996
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Сомневаюсь, что этого будет достаточно. Значительно более сложный murmur3, изначально сделаный с поддержкой seed, и тот не устоял.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39807011
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyrgreat,

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

Но если уж хочеться - меняйте seed пока кол-во коллизий не уменьшиться ниже определенного порога. Ну или пока не надоест.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39807029
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatКакой смысл пытаться решить принципиально нерешаемую задачу?
Насколько мне известно, на SipHash и BobJenkisnHash lookup3 (тот что в дельфях) с рандомизированным seed атак нет.

rgreatНо если уж хочеться - меняйте seed пока кол-во коллизий не уменьшиться ниже определенного порога. Ну или пока не надоест.
Нет, я просто не стану использовать функцию, которая для этого не годится. По крайней мере, не таким способом.

Есть другой вариант для простых функций - делать двойное хеширование и на завершающем этапе результат одной из функций использовать в качестве входных данных для другой.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39807031
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyНасколько мне известно, на SipHash и BobJenkisnHash lookup3 (тот что в дельфях) с рандомизированным seed атак нет.За счет какого волшебного механизма они могут исчезнуть?
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39807040
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЗа счет какого волшебного механизма они могут исчезнуть?
Никто не говорит, что они исчезли. Появится завтра новый метод анализа и, возможно, выработают алгоритм для атаки.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39807061
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey> Появится завтра новый метод анализа и, возможно....
Будет хак, новая версия Delphi или будут юзать старые методы...
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809378
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Довелось сравнить производительность TDictionary<Integer,Integer> в D10.2 и QMap<int, int> в QT 5.12.
Сравнение в пользу Delphi.

Такой код в Delphi:
for I := 1 to 1000000 do
d.Add(I, I);
выполняется за 400 мс в Debug и 300 мс в Release.

В QT (msvc 2015 x86) код
for (int i = 0; i < 1000000; ++i) {
dict[i] = i;
}
выполняется 2500 мс (Debug) (релиз не пробовал).

Поиск по ключу в Delphi также выполняется быстрее (примерно в 2 раза).
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809381
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

https://doc.qt.io/qt-5/qmap.html The QMap class is a template class that provides a red-black-tree -based dictionary.
Какой смысл сравнивать разные структуры? Хеш-таблицы там: QHash и QSet.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809391
Голландец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809450
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyDmSer,

https://doc.qt.io/qt-5/qmap.html The QMap class is a template class that provides a red-black-tree -based dictionary.
Какой смысл сравнивать разные структуры? Хеш-таблицы там: QHash и QSet.

Какая разница что там под капотом? Сравнивались аналогичные инструменты. Попробую еще со стандартным map сравнить.
Я c++ не знаю, тем более qt. Может map / QMap никто в качестве словарей не использует. Тогда что используют.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809457
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую сравнить с QHash. Судя по описанию, оно должно быть ближе к TDictionary в плане реализации. Название правда отпугивает :)
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809458
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerМожет map / QMap никто в качестве словарей не использует. Тогда что используют.
обычно std::map
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809460
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerКакая разница что там под капотом?
Разница большая . Смотри таблицу с ассоциативными контейнерами.

QMap and QHash provide very similar functionality. The differences are:

QHash provides average faster lookups than QMap. (See Algorithmic Complexity for details.)
When iterating over a QHash, the items are arbitrarily ordered. With QMap, the items are always sorted by key.
The key type of a QHash must provide operator==() and a global qHash(Key) function. The key type of a QMap must provide operator<() specifying a total order. Since Qt 5.8.1 it is also safe to use a pointer type as key, even if the underlying operator<() does not provide a total order.


DmSerСравнивались аналогичные инструменты.
Вовсе нет. Словарь - это просто интерфейс. Реализовать его можно очень по-разному. Вот ты взял дельфийский словарь реализованный через хеш-таблицу (просто потому, что других в коробке нет), а сравниваешь со словарём реализованным через красно-чёрное дерево. Правильнее было бы сравнивать с QHash .
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809463
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer Может map / QMap никто в качестве словарей не использует. Тогда что используют.словари на сбалансированных деревьях используют, когда нужны жёсткие гарантии времени - т.е. есть вероятность, что на таблицу могут провести внешнюю атаку
и когда нужна упорядоченность по ключу
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809465
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по хэш-таблицам была одна интересная статейка , там подробно описывается как и с чем он борется
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809467
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)т.е. есть вероятность, что на таблицу могут провести внешнюю атаку
Разве в Qt'шных таблицах это не залечили использованием QT_HASH_SEED?
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809476
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeykealon(Ruslan)т.е. есть вероятность, что на таблицу могут провести внешнюю атаку
Разве в Qt'шных таблицах это не залечили использованием QT_HASH_SEED?это усложняет, но не исключает

самый известный способ для полного "залечивания" - нужно совмещать хэштаблицу и сбалансированное дерево, что сведёт худший случай к O(LOG(N))

в статейке выше есть красивая попытка ещё более усложнить задачу атаки на хэш, но предсказать ошибки в её дееспособности я не могу
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809479
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)это усложняет, но не исключает
А какая хеш-функция, по дефолту, там используется? Seed они добавили сильно позже чем стало известно о таких атаках, наверняка делали с учётом новых реалий.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809505
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорость QHash сопоставима с TDictionary.
Добавление в QHash медленнее (примерно в 2 раза), зато поиск быстрее (в 2 - 3 раза).
Цикл
for (int i = 0; i < 1000000; ++i) {
dict.contains(i);
выполняется примерно 60 мс (при Debug)
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809508
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

А если обеим таблицам предварительно размер установить ?
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809516
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyА какая хеш-функция, по дефолту, там используется? Seed они добавили сильно позже чем стало известно о таких атаках, наверняка делали с учётом новых реалий.я с Qt на вы, не ковырял реализацию, но принципиально это не поможет при определённом желании
с другой стороны - Qt графическая библиотека и не для серверов, с какого ляду кому-то нагружать свой же комп

В гуи обычно проблемы когда нужно копировать из одной таблицы в другую, тогда например тот же TDictonary замедлится чудовищно, из-за одинаковых хэш-функций и взаимнопростых делителей. Достаточно поменять что-то одно и всё будет летать - делитель поменять сложно(фактически переписать реализацию), а вот другую хэш-функцию задать довольно просто.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809522
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)я с Qt на вы, не ковырял реализацию, но принципиально это не поможет при определённом желании
Нашёл, что там что-то на основе PJW, правда не совсем понятно куда там seed прикрутили. А вообще, проблема с этой атакой вполне решаема. Я писал выше о SipHash, почти все на неё перешли. На один из первых вариантов lookup3 тоже была атака, однако, потом были внесены изменения и про атаки на неё больше не слышно.

kealon(Ruslan)Qt графическая библиотека и не для серверов
Изначально так и было, но сейчас Qt это полноценный фреймвок с очень неплохим покрытием. Да и что там нужно для серверов, умение в сокеты...

kealon(Ruslan)когда нужно копировать из одной таблицы в другую, тогда например тот же TDictonary замедлится чудовищно, из-за одинаковых хэш-функций и взаимнопростых делителей. Достаточно поменять что-то одно и всё будет летать - делитель поменять сложно(фактически переписать реализацию), а вот другую хэш-функцию задать довольно просто.
Достаточно искоробочную функцию инициализировать рандомно .
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809533
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

перевод этот читал раньше, сильные чувства обуревали меня: )

замешаны в кучу правда, догадки, игнор очевидного и странные экперименты.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809537
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyDmSer,

А если обеим таблицам предварительно размер установить ?

В QT чуть быстрее стало, однако каждый замер отличается очень большим разбросом, поэтому не могу сказать конкретно, на сколько быстрее, может процентов на 10. Стало в среднем 600 мс.

В Delphi стало явно быстрее: 400->280 мс (Debug) и 300->234 мс (Release), причем при каждом замере разброс получается минимальным. Видимо, благодаря замечательному менеджеру памяти.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809542
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

Похоже, таблицы там используют метод цепочек.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809549
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeykealon(Ruslan)когда нужно копировать из одной таблицы в другую, тогда например тот же TDictonary замедлится чудовищно, из-за одинаковых хэш-функций и взаимнопростых делителей. Достаточно поменять что-то одно и всё будет летать - делитель поменять сложно(фактически переписать реализацию), а вот другую хэш-функцию задать довольно просто.
Достаточно искоробочную функцию инициализировать рандомно . это и есть "поменять хэш-функцию". seed другой -> распределение - другое
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809550
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerДовелось сравнить производительность TDictionary<Integer,Integer> в D10.2 и QMap<int, int> в QT 5.12.
Сравнение в пользу Delphi.

Такой код в Delphi:
for I := 1 to 1000000 do
d.Add(I, I);
выполняется за 400 мс в Debug и 300 мс в Release.

В QT (msvc 2015 x86) код
for (int i = 0; i < 1000000; ++i) {
dict[i] = i;
}
выполняется 2500 мс (Debug) (релиз не пробовал).

Поиск по ключу в Delphi также выполняется быстрее (примерно в 2 раза).
...опиции оптимизации?
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809552
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё...опиции оптимизации?

Я ноль в QT, какие опции? :))
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809555
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerёёёёё...опиции оптимизации?

Я ноль в QT, какие опции? :))
Опции компилятора MS VS 2013 (ты ведь о нем?) и эмбаркадеро.

Хорошо бы сравнить не "по умолчанию", а сколько получится, если "педаль до полика".
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809572
Голландец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравните ради прикола с Rapid.Generics. А то на сайте цифры хорошие, а что на практике - не понятно. TRapidDictionary вроде
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809575
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Голландец,

Оптимизатор, палишься ведь
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809595
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГолландецСравните ради прикола с Rapid.Generics. А то на сайте цифры хорошие, а что на практике - не понятно. TRapidDictionary вроде

Вообще, фантастика!
Добавление 1000000 - за 62 мс,
поиск 1000000 - за 16 мс.

Колдовство!
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809597
Голландец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо ещё на баги проверить
Может оно косячит
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809601
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

Неправильно, ты, дядя Фёдор бутерброд ешь! (c) Выбери сперва четные или нечетные ключи а потом наоборот, т.е. не последовательно.
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809603
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyВыбери сперва четные или нечетные ключи а потом наоборот, т.е. не последовательно.
А нет, рандомно нужно (жаль, того кода у меня не осталось).
...
Рейтинг: 0 / 0
Производительность TDictionary
    #39809656
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГолландецМожет оно косячит
Код: pascal
1.
2.
3.
4.
5.
6.
7.
 var rd := TRapidDictionary<Integer, Integer>.Create(11);

 for var i := 0 to 10 do
  rd.Add(i, i);

 for var i in rd.keys do
  writeln(i);


Исправляй, оптимизатор ;)
...
Рейтинг: 0 / 0
60 сообщений из 60, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Производительность TDictionary
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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