Информация об изменениях

Сообщение Re[3]: Оптимизация через разделение/вынос функционала от 15.06.2024 11:31

Изменено 15.06.2024 11:32 swame

Re[3]: Оптимизация через разделение/вынос функционала
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, swame, Вы писали:



S>>Измерений не делал, но по виду кода такой алгоритм будет на порядок — два медленнее стандартного дельфового,

S>>так как в нем огромное количество лишнего распределения памяти.
S>>Может использовал бы стандартный — ускорил бы в сто тыщ раз, и некрасивый код с копированием данных не понадобился.
S>>Сделай тест, сравни со стандартным.
S>>И нахрена писать все в строчку.

K>Понятно что тут лишние такты уходят на выделение памяти, обработку классов и присвоения; полагаю, этот код примерно в 2-5 раз медленнее стандартной быстрой сортировки. Но всё равно для больших массивов он в миллион раз быстрее простой сортировки из двух вложенных циклов. Я же говорю что аналогичным алгоритмом ускорил одну процедуру в своей программе где-то в тысячу раз. Ну а если надо ещё ускорить, наверно первичное — заменить класс на рекорд в Delphi, и ещё наверно держать временные массивы не с числами а с указателями (индексами для исходного массива).


tdoublearray = class (TList<double>)
Потестировал, взяв tdoublearray = class (TList<double>) и исправив несколько ошибок в коде
твой код сливает стандартной сортировке, которая вызывается в 1 строчку, в 1,5 раза примерно во всем диапазоне. я думал , будет больше.
возможно на твоих классах будет еще медленней, TList<> отлично оптимизирован.
И это еще не считая дополнительного копирования.
Кроме того nвой код рухает, если встречаются одинаковые значения, а на 50 млн уже Out of memory.
Попросил еще ChatGPT сгенерить банальный quicksort он работает в 2,5 — 3 раза быстрей стандарного, и никаких копирований памяти

14:00:32.845 : standard 1000 1000 > 111.10ms^
14:00:32.956 : super 1000 1000 > 168.36ms^^
14:00:33.124 : quick 1000 1000 > 30.61ms...

14:00:33.161 : standard 1000000 1 > 272.24ms^^^
14:00:33.434 : super 1000000 1 > 337.74ms^^^
14:00:33.771 : quick 1000000 1 > 112.70ms^
14:00:33.948 : standard 10000000 1 > 3.21s***
14:00:37.154 : super 10000000 1 > 4.03s****
14:00:41.181 : quick 10000000 1 > 1.38s*
14:00:42.916 : standard 50000000 1 > 17.31s*****************
14:01:00.231 : quick 50000000 1 > 7.41s*******

Попросил еще ChatGPT сгенерить банальный quicksort он работает в 2,5 — 3 раза быстрей стандарного, и никаких копирований памяти.
В тесте он quick
procedure tdoublearray.QuickSort(low, high: Integer);
var
  i, j: Integer;
  pivot, temp: double;
begin
  i := low;
  j := high;
  pivot := Items[(low + high) div 2];

  repeat
    while Items[i] < pivot do
      Inc(i);
    while Items[j] > pivot do
      Dec(j);

    if i <= j then
    begin
      temp := Items[i];
      Items[i] := Items[j];
      Items[j] := temp;
      Inc(i);
      Dec(j);
    end;
  until i > j;

  if low < j then
    QuickSort(low, j);
  if i < high then
    QuickSort(i, high);
end;
Re[3]: Оптимизация через разделение/вынос функционала
Здравствуйте, Khimik, Вы писали:

K>Здравствуйте, swame, Вы писали:



S>>Измерений не делал, но по виду кода такой алгоритм будет на порядок — два медленнее стандартного дельфового,

S>>так как в нем огромное количество лишнего распределения памяти.
S>>Может использовал бы стандартный — ускорил бы в сто тыщ раз, и некрасивый код с копированием данных не понадобился.
S>>Сделай тест, сравни со стандартным.
S>>И нахрена писать все в строчку.

K>Понятно что тут лишние такты уходят на выделение памяти, обработку классов и присвоения; полагаю, этот код примерно в 2-5 раз медленнее стандартной быстрой сортировки. Но всё равно для больших массивов он в миллион раз быстрее простой сортировки из двух вложенных циклов. Я же говорю что аналогичным алгоритмом ускорил одну процедуру в своей программе где-то в тысячу раз. Ну а если надо ещё ускорить, наверно первичное — заменить класс на рекорд в Delphi, и ещё наверно держать временные массивы не с числами а с указателями (индексами для исходного массива).


tdoublearray = class (TList<double>)
Потестировал, взяв tdoublearray = class (TList<double>) и исправив несколько ошибок в коде
твой код сливает стандартной сортировке, которая вызывается в 1 строчку, в 1,5 раза примерно во всем диапазоне. я думал , будет больше.
возможно на твоих классах будет еще медленней, TList<> отлично оптимизирован.
И это еще не считая дополнительного копирования.
Кроме того nвой код рухает, если встречаются одинаковые значения, а на 50 млн уже Out of memory.
Попросил еще ChatGPT сгенерить банальный quicksort он работает в 2,5 — 3 раза быстрей стандарного, и никаких копирований памяти

14:00:32.845 : standard 1000 1000 > 111.10ms^
14:00:32.956 : super 1000 1000 > 168.36ms^^
14:00:33.124 : quick 1000 1000 > 30.61ms...
14:00:33.161 : standard 1000000 1 > 272.24ms^^^
14:00:33.434 : super 1000000 1 > 337.74ms^^^
14:00:33.771 : quick 1000000 1 > 112.70ms^
14:00:33.948 : standard 10000000 1 > 3.21s***
14:00:37.154 : super 10000000 1 > 4.03s****
14:00:41.181 : quick 10000000 1 > 1.38s*
14:00:42.916 : standard 50000000 1 > 17.31s*****************
14:01:00.231 : quick 50000000 1 > 7.41s*******

Попросил еще ChatGPT сгенерить банальный quicksort он работает в 2,5 — 3 раза быстрей стандарного, и никаких копирований памяти.
В тесте он quick
procedure tdoublearray.QuickSort(low, high: Integer);
var
  i, j: Integer;
  pivot, temp: double;
begin
  i := low;
  j := high;
  pivot := Items[(low + high) div 2];

  repeat
    while Items[i] < pivot do
      Inc(i);
    while Items[j] > pivot do
      Dec(j);

    if i <= j then
    begin
      temp := Items[i];
      Items[i] := Items[j];
      Items[j] := temp;
      Inc(i);
      Dec(j);
    end;
  until i > j;

  if low < j then
    QuickSort(low, j);
  if i < high then
    QuickSort(i, high);
end;