Сообщение 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
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.
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
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.
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;