powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поиск уникальных png иконок
25 сообщений из 57, страница 2 из 3
Поиск уникальных png иконок
    #40111139
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Потому что при общем количестве 10000 иконок разницы между 3 и 10 нет
Ну при 3х уникальных, я бы и сам посоветовал comparemem. :)
Другое дело если уникальных десятки.
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111145
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Вот это уже ближе к делу.

Бери сразу пять. Чтобы время их вычисления окончательно сравнялось со временем
сравнения, а суммарный размер - с размером самой иконки. И будет тебе счастье,
ага...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111150
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Чтобы время их вычисления окончательно сравнялось со временем сравнения,
Ша! Сейчас тестировать будем.
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111154
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
А значит для каждой иконки CompareMem пробежит все байты
А ты уверен, что "пробежать все байты" - медленнее, чем пробежать по этим байтам и посчитать какой-то хэш?
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111155
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Dimitry Sibiryakov
Чтобы время их вычисления окончательно сравнялось со временем сравнения,
Ша! Сейчас тестировать будем.
Даю прогноз: если иконки уже в памяти, то метод с CompareMem займёт 0 - 16 миллисекунд.
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111158
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гм... Я тоже подумываю над подобной задачей, правда пока не приступал. Думаю использование хэшей обязательно (по крайней мере для моей задачи)
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111188
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Каждый файл ico может содержать до 65 535 изображений.
Т.обр. если картинка 32х32, то общее максимальное количество пикселей может достигать 65535*32*32. Пусть каждый пиксель будет 4 байта... файлик получится размером 268 435 456 байт.
10-20 тыс иконок... э...
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111189
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
Каждый файл ico
Казалось бы при чем здесь файлы, а тем более ico, если в стартовом посте написано
_Vasilisk_
Есть набор png иконок
?
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111190
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

вот я лошара...
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111207
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача очень похожа на дедубликацию файлов на диске.

На сегодня это уже решенная задача. Там - нечего изобретать. Берите утилиты dedup (тысячи их).
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111229
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Задача очень похожа на дедубликацию файлов на диске.
На сегодня это уже решенная задача.
Это замечательно. За исключением одного маленького факта
_Vasilisk_
Они все в памяти. В объектах GDI+
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111252
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Не путаю. Но они неотличимы без сравнения данных

Отличимы тем, что вероятность одного стремится к нулю.
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111295
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но достигнет нуля только в случае когда размер хэша сравняется с размером
хэшируемых данных. А по условиям задачи ложноотрицательные ответы недопустимы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111319
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну этак надо от всех хешей вообще избавиться, ведь есть 0.00000001% шанс совпадения на реальных данных
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111322
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал на CompareMem, посмотрел на результаты. На 10 000 иконок 16х16 время обнаружения дубликатов стабильно 100 миллисекунд вне зависимости от количества уникальных иконок. Проверял для 1, 5, 10, 20 уникальных иконок.

На вариант с поиском по хешу (без проверки коллизий) уходит 168 миллисекунд также вне зависимости от количества уникальных иконок
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111330
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот итоговый класс
Код: 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.
type
  TIconList = class
  strict private
    type
      TIconSize = record
        Width: Integer;
        Height: Integer;
      end;
      TIconData = TArray<Byte>;
      TIconItem = record
        Data: TIconData;
        Index: Integer;
      end;
      TIconItems = TList<TIconItem>;
    class var
      FCurIdx: Integer;
  strict private
    FIcons: TObjectDictionary<TIconSize, TIconItems>;
  public
    constructor Create;
    destructor Destroy; override;
    function TryAddIcon(const AIcon: TIconData; AWidth, AHeight: Integer;
      out AIndex: Integer): Boolean;
  end;

{ TIconList }

constructor TIconList.Create;
begin
  inherited Create;
  FIcons := TObjectDictionary<TIconSize, TIconItems>.Create([doOwnsValues]);
end;

destructor TIconList.Destroy;
begin
  FIcons.Free;
  inherited Destroy;
end;

function TIconList.TryAddIcon(const AIcon: TIconData; AWidth,
  AHeight: Integer; out AIndex: Integer): Boolean;
var
  LSize: TIconSize;
  LItems: TIconItems;
  LItem: TIconItem;
begin
  LSize.Width := AWidth;
  LSize.Height := AHeight;
  if not FIcons.TryGetValue(LSize, LItems) then begin
    LItems := TIconItems.Create;
    FIcons.Add(LSize, LItems);
  end;
  for LItem in LItems do begin
    if
      (Length(LItem.Data) = Length(AIcon)) and
      CompareMem(LItem.Data, AIcon, Length(AIcon))
    then begin
      AIndex := LItem.Index;
      Result := False;
      Exit;
    end;
  end;
  AIndex := FCurIdx;
  Inc(FCurIdx);
  LItem.Data := AIcon;
  LItem.Index := AIndex;
  LItems.Add(LItem);
  Result := True;
end;

...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111344
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Прикольно, а с хешами какой код?
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111351
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
TIconItems = TDictionary<Integer, Integer>;

function TIconList.TryAddIcon(const AIcon: TIconData; AWidth,
  AHeight: Integer; out AIndex: Integer): Boolean;
var
  LSize: TIconSize;
  LItems: TIconItems;
  LHash: Integer;
begin
  LSize.Width := AWidth;
  LSize.Height := AHeight;
  if not FIcons.TryGetValue(LSize, LItems) then begin
    LItems := TIconItems.Create;
    FIcons.Add(LSize, LItems);
  end;
  LHash := THashBobJenkins.GetHashValue(AIcon[0], Length(AIcon));
  if LItems.TryGetValue(LHash, AIndex) then begin
    Result := False;
    Exit;
  end;
  AIndex := FCurIdx;
  Inc(FCurIdx);
  LItems.Add(LHash, AIndex);
  Result := True;
end;

...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111386
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Можно подоптимизировать, наверно. Например, Length(AIcon) 2 раза вызывается, а можно сделать один.

Ну и, раз кол-во одинаковых не влияет, значит время тратится вообще не на сравнение.
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111389
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
mayton
Задача очень похожа на дедубликацию файлов на диске.
На сегодня это уже решенная задача.
Это замечательно. За исключением одного маленького факта
_Vasilisk_
Они все в памяти. В объектах GDI+

По постановке задачи - это все выглядит как одноразовая задача. Почистить ресурсы от дублей и забыть эту задачу как страшный сон.
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111390
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Length(AIcon) 2 раза вызывается, а можно сделать один.
Нет смысла. Т.к. длина хранится по отрицательному смещению, и это смещение вычисляется сразу, то что Length, что переменная дадут идентичный ассемблерный код. Только с разным смещением
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111391
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
По постановке задачи - это все выглядит как одноразовая задача.
Как раз наоборот - это будет постоянно работающий код. Иначе вопрос оптимизации вообще бы не стоял
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111394
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
YuRock
Length(AIcon) 2 раза вызывается, а можно сделать один.
Нет смысла. Т.к. длина хранится по отрицательному смещению, и это смещение вычисляется сразу, то что Length, что переменная дадут идентичный ассемблерный код. Только с разным смещением
Length - всё же функция, требует вызова, возврата. Накладные расходы таки есть.
Может, конечно, я отстал от жизни.
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111425
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Length - всё же функция
Это не функция, но таки с переменной поэкономнее
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TForm1.Button1Click(Sender: TObject);
var
  LBytes: TBytes;
  LSavedLen: Integer;
  LLen: Integer;
begin
  LSavedLen := Length(LBytes);
  LLen := LSavedLen;
end;

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Unit1.pas.466: LSavedLen := Length(LBytes);
008F83F7 8B45F8           mov eax,[ebp-$08]
008F83FA 8945EC           mov [ebp-$14],eax
008F83FD 837DEC00         cmp dword ptr [ebp-$14],$00
008F8401 740B             jz $008f840e
008F8403 8B45EC           mov eax,[ebp-$14]
008F8406 83E804           sub eax,$04
008F8409 8B00             mov eax,[eax]
008F840B 8945EC           mov [ebp-$14],eax
008F840E 8B45EC           mov eax,[ebp-$14]
008F8411 8945F4           mov [ebp-$0c],eax
Unit1.pas.467: LLen := LSavedLen;
008F8414 8B45F4           mov eax,[ebp-$0c]
008F8417 8945F0           mov [ebp-$10],eax
Unit1.pas.468: end;
...
Рейтинг: 0 / 0
Поиск уникальных png иконок
    #40111441
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
я особо в детали во всех сообщениях не вникал, но правильно ли понимаю, что алгоритм без хэшей - просто по очереди перебираются иконки, сравниваются через CompareMem с уже отобранными, и если не совпадает ни с одной, то иконка добавляется. А с хэшем - считается хэш каждой иконки и сравниваются хеши. Т.е. как бы выигрыш по скорости, что хэш считается 1 раз для иконки, а если 10 уникальных, то потом 10 сравнений хэшей, а не 10 сравнений CompareMem.
И 1-ый вариант, без хэшей, на реальных данных сейчас получается быстрее?
...
Рейтинг: 0 / 0
25 сообщений из 57, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поиск уникальных png иконок
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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