Вверх ↑
Этот топик читают: Гость
Ответов: 1886
Рейтинг: 164
#1: 2017-12-22 21:49:26 ЛС | профиль | цитата
Вот, сравните скорости работы двух вариантов схемы:

Add(StrList,10529341,364,196)
{
}
Add(DropFile,3316770,231,224)
{
link(onDropFile,6375637:doEvent1,[])
}
Add(Hub,6375637,287,224)
{
OutCount=7
link(onEvent1,10529341:doLoad,[])
link(onEvent2,852630:doStart,[(344,237)(344,370)])
link(onEvent3,2337639:doFilter,[(339,244)(339,279)])
link(onEvent4,852630:doStop,[(334,251)(334,377)])
link(onEvent5,5063727:doStart,[(325,258)(325,538)])
link(onEvent6,981907:doEnum,[(320,265)(320,468)])
link(onEvent7,5063727:doStop,[(314,272)(314,545)])
}
Add(ArrayFilterRepeats,2337639,378,273)
{
link(onFilter,16647966:doAdd,[])
link(Array,2540263:Var2,[])
}
Add(StrList,16647966,441,273)
{
}
Add(TimeCounter,852630,378,364)
{
link(onStop,10842207:doText,[])
}
Add(Label,10842207,427,371)
{
Left=10
Top=10
}
Add(ArrayEnum,981907,350,462)
{
link(onItem,1315296:doGetIndex,[])
link(Array,2540263:Var1,[(356,257)])
}
Add(GetDataEx,2540263,378,252)
{
link(Data,10529341:Array,[])
}
Add(TimeCounter,5063727,350,532)
{
link(onStop,6318540:doText,[])
}
Add(Label,6318540,399,539)
{
Left=10
Top=35
}
Add(StrList,1315296,546,420)
{
Point(onGetIndex)
Point(doGetIndex)
link(Str,981907:Item,[(552,408)(454,408)(454,506)(356,506)])
link(onGetIndex,788058:doCase,[])
}
Add(Case,788058,595,427)
{
Value=Integer(-1)
link(onTrue,1315296:doAdd,[(639,440)(639,482)(531,482)(531,426)])
}

Разница в 3-4 раза в пользу doGetIndex! Так почему бы в компоненте не заменить


procedure THIArrayFilterRepeats._work_doFilter0;
var
i, j: integer;
Repeats: boolean;
s:string;
begin
ArrIn := ReadArray(_data_Array);
if (ArrIn = nil) or (ArrIn._Count = 0) then exit;

StrArray.Clear;

for i := 0 to ArrIn._Count - 1 do
begin
s := ToString(GetArrayVal(i));
Repeats := false;
for j := 0 to StrArray.Count - 1 do
if StrArray.Items[j] = s then
begin
Repeats := true;
break;
end;
if Repeats then continue;

StrArray.Add(s);
_hi_onEvent(_event_onFilter, s);
end;
_hi_CreateEvent_(_Data, @_event_onEndFilter);
end;

на


procedure THIArrayFilterRepeats._work_doFilter0;
var
i, j: integer;
Repeats: boolean;
s:string;
begin
ArrIn := ReadArray(_data_Array);
if (ArrIn = nil) or (ArrIn._Count = 0) then exit;

StrArray.Clear;

for i := 0 to ArrIn._Count - 1 do
begin
s := ToString(GetArrayVal(i));
{Repeats := false;
for j := 0 to StrArray.Count - 1 do
if StrArray.Items[j] = s then
begin
Repeats := true;
break;
end;
if Repeats then continue;

StrArray.Add(s);}
//---------------------правка от 22.12.2017 by 3042
if StrArray.IndexOf(s) = -1 then
begin
StrArray.Add(s);
_hi_onEvent(_event_onFilter, s);
end;
//--------------------конец правки-----------------
end;
_hi_CreateEvent_(_Data, @_event_onEndFilter);
end;


Nesco, как считаешь?
карма: 7
0
vip
#1.1контекстная реклама от партнеров
Разработчик
Ответов: 25681
Рейтинг: 2087
#2: 2017-12-22 22:33:34 ЛС | профиль | цитата
Пофиксил
карма: 20

0
Ответов: 9906
Рейтинг: 351
#3: 2017-12-23 12:33:58 ЛС | профиль | цитата
nesco писал(а):
Пофиксил

А тогда, что это за наскальные надписи:
compiler писал(а):

Подготовка к сборке проекта...
Генерация кода целевого языка
Компоновка проекта...
Command line: dcc32.exe "D:\Programs\HiAsm\Elements\delphi\code\Project6.dpr" "-UD:\Programs\HiAsm\." -Q -GD
Borland Delphi Version 12.0 Copyright (c) 1983,98 Inprise Corporation

D:\Programs\HiAsm\Elements\delphi\code\hiArrayFilterRepeats.pas(64) Hint: Variable 'j' is declared but never used in 'THIArrayFilterRepeats._work_doFilter0'

D:\Programs\HiAsm\Elements\delphi\code\hiArrayFilterRepeats.pas(65) Hint: Variable 'Repeats' is declared but never used in 'THIArrayFilterRepeats._work_doFilter0'
73707 lines, 0.22 seconds, 60832 bytes code, 2081 bytes data.
Сборка завершена.


Редактировалось 1 раз(а), последний 2017-12-23 12:34:28
карма: 9

0
Разработчик
Ответов: 25681
Рейтинг: 2087
#4: 2017-12-23 15:16:45 ЛС | профиль | цитата
Galkov писал(а):
А тогда, что это за наскальные надписи:

Все вопросы к 3042. В коде же ясно написано "правка от 22.12.2017 by 3042". По что он не заблокировал эти переменные, мне неизвестно.
карма: 20

0
Ответов: 9906
Рейтинг: 351
#5: 2017-12-23 15:37:25 ЛС | профиль | цитата
Анекдот

Армянскому Радио задает вопрос пионер Петя: "Скажите пожалуйста, что такое синхрофазотрон ???"
Армянское Радио отвечает: "Пионер Петя, не выёживайся !!!!!!!"

BTW: из серии уж сколько раз твердили миру...
Методом "деления пополам" быстрее будет:
    //---------------------правка от 23.12.2017 by Galkov
if not StrArray.Find(s, j) then
begin
StrArray.Insert(j, s);
_hi_onEvent(_event_onFilter, s);
end;
//--------------------конец правки-----------------

Редактировалось 2 раз(а), последний 2017-12-23 15:39:51
карма: 9

0
Разработчик
Ответов: 25681
Рейтинг: 2087
#6: 2017-12-23 19:16:20 ЛС | профиль | цитата
Galkov писал(а):
BTW: из серии уж сколько раз твердили миру...
Методом "деления пополам" быстрее будет:

А не вариант выложить весь код с окончательными правками?
карма: 20

0
Ответов: 1886
Рейтинг: 164
#7: 2017-12-24 21:50:19 ЛС | профиль | цитата
Galkov, описание для Find в KOL какое-то мутное, мол, работает только для сортированного списка.
StrArray.Insert(j, s); - это его отсортирует?

Galkov писал(а):
А тогда, что это за наскальные надписи:

Это я недоглядел. Но сейчас надо разобраться с Find. Почему он будет быстрее, чем IndexOf?

--- Добавлено в 2017-12-24 22:10:00

Galkov, сейчас проверил - действительно раз в 20 быстрее IndexOf (3000 строк за 25 мс против 516 для IndexOf).

Редактировалось 1 раз(а), последний 2017-12-24 22:10:00
карма: 7
0
Ответов: 9906
Рейтинг: 351
#8: 2017-12-25 13:06:36 ЛС | профиль | цитата
3042 писал(а):
действительно раз в 20 быстрее IndexOf

BTW: из серии уж сколько раз твердили миру... (например)
Сравнивать быстродействие алгоритмов с разными асимптотиками - НЕ КОРРЕКТНО

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

Редактировалось 1 раз(а), последний 2017-12-25 13:13:14
карма: 9

0
Ответов: 1886
Рейтинг: 164
#9: 2017-12-25 17:36:21 ЛС | профиль | цитата
Galkov писал(а):
Сравнивать быстродействие алгоритмов с разными асимптотиками - НЕ КОРРЕКТНО

А как же это:
Galkov писал(а):
Методом "деления пополам" быстрее будет:



Galkov писал(а):
файлы, на которых производилось сравнение

Ну, вот сделал для примера разные файлы по 10 000 строк. И всё равно лидирует метод пополам.

Galkov, так по Вашему мнению - какой алгоритм следует оставить в комопненте?
карма: 7
0
файлы: 1mass.rar [7.2KB] [268]
Ответов: 9906
Рейтинг: 351
#10: 2017-12-26 17:09:52 ЛС | профиль | цитата
3042 писал(а):
А как же это:
А это мое утверждение, оно как бы -- асимптотическое.
Вариант оригинала (и Ваш - тоже) имеет асимптотику (предположим, для файла "без повторов") O(N^2), а "делением пополам" - O(N*ln(N)). Результат сравнения этих асимптотик достаточно очевиден...
В Вашем случае ускорение получается потому, что отсутствует операция динамического создания/уничтожения копии строки. Это динамическое созидание делает TStrList.Items. А TStrList.IndexOf просто сравнивает строки, как разыменованные PChar-ы.
Так мне показалось...

3042 писал(а):
Ну, вот сделал для примера разные файлы по 10 000 строк
В принципе -- разумно... Без повторов, по одному повтору, очень-очень много повторов.

3042 писал(а):
какой алгоритм следует оставить в компоненте?
Это требует обсуждения... Нет обратной совместимости: массив с нижней точки теперь уже отсортирован. И пока только для строк.
Если на Ваших тестах "быстрее по-любому", тогда эта модификация разумна. Если "обратная несовместимость" не напрягает...
И, конечно же, во многом разумность теряется, если не сделать аналогичное для Integer и Real.



В общем, возиться надо.

Редактировалось 4 раз(а), последний 2017-12-26 17:12:20
карма: 9

0
Разработчик
Ответов: 4682
Рейтинг: 423
#11: 2017-12-27 00:06:56 ЛС | профиль | цитата
Galkov, тебя послушай, так надо горы заодно свернуть ради перекидывания бревна через ров, чтобы перебраться на другую сторону. Считаю, что нет смысла все усложнять, и фичи внедрять поэтапно, а не сразу скопом. По поводу обратной совместимости:

Я здесь не вижу "массив содержит элементы в том же порядке, в котором они встречаются в оригинальном". Что не документировано, то не обязательно соблюдать. Даже если кому-то важен оригинальный порядок, просто сделает новый массив по событию onFilter. Также не стоит писать "содержит отсортированный отфильтрованный массив", чтобы на это не полагались при составлении схем.
А в будущем можно и Integer, и Real сделать, и вообще свойство выбора алгоритма (с сортировкой и быстрый или с сохранением оригинального порядка и медленнее).
карма: 10
0
Ответов: 9906
Рейтинг: 351
#12: 2017-12-27 20:30:34 ЛС | профиль | цитата
Assasin писал(а):
тебя послушай, так надо горы заодно свернуть ради перекидывания бревна через ров, чтобы перебраться на другую сторону

А ты не слушай, а занимайся каким-то более простым делом.
Коль скоро для тебя код "из пяти строк" является "сворачиванием гор".
Преодолеешь этот страшный барьер - добро пожаловать обратно в тему....

Тема называется Ускорение ArrayFilterRepeats.
У меня на эту тему возникли соображения. И я их изложил.
При этом -- ни на чем не настаиваю.
В чем проблемы, Assasin

Assasin писал(а):
Считаю, что нет смысла все усложнять, и фичи внедрять поэтапно, а не сразу скопом

Плавали, знаем.
Способ делать полуработающий код. И всегда будет отмастка -- это же всего лишь очередной этап.

Просто пример: когда я делал lnk_trace, то не внедрял фичи поэтапно. Не делал версии 2.0, 3.2, и т.п..
Так вот - оно просто работает. И все.
Потому что целью являлся результат, а не процесс внедрения фич поэтапно.
Разницу чувствуете

Редактировалось 1 раз(а), последний 2017-12-27 20:35:12
карма: 9

0
Разработчик
Ответов: 4682
Рейтинг: 423
#13: 2017-12-28 08:46:59 ЛС | профиль | цитата
Galkov писал(а):
Коль скоро для тебя код "из пяти строк" является "сворачиванием гор".
Преодолеешь этот страшный барьер - добро пожаловать обратно в тему....

Нет, сворачивание гор - это сделать все и сразу, и идеально, о чем ты и говоришь. А я как раз говорю о другом:
Assasin писал(а):
фичи внедрять поэтапно, а не сразу скопом

Galkov писал(а):
Способ делать полуработающий код. И всегда будет отмастка -- это же всего лишь очередной этап.

И снова нет. Делать полурабочий код порой даже хуже, чем все и сразу. Здесь ситуация другая: от изменения этих 5 строчек код не становится полурабочим. От добавления фильтрации чисел он опять не становится полурабочим. И даже после внедрения свойства выбора алгоритма он не будет полурабочим. Как и окончательно завершенным (т.е. с отсутствием простора для модернизаций). Не бывает такого.
В твоем случае
Galkov писал(а):
В общем, возиться надо.

А я предлагаю не возиться, а спокойно делать дела.

Редактировалось 2 раз(а), последний 2017-12-28 08:48:23
карма: 10
0
Ответов: 9906
Рейтинг: 351
#14: 2017-12-28 12:35:55 ЛС | профиль | цитата
Assasin писал(а):
а спокойно делать дела

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

Это возможно. Не так уж здесь все и сложно.
А пока что, ты посты пишешь про адекватность шанхаестроения.
((а промежуточные версии оставь себе, и гордись ими))
карма: 9

0
Ответов: 1886
Рейтинг: 164
#15: 2017-12-28 18:31:55 ЛС | профиль | цитата
Galkov писал(а):
массив с нижней точки теперь уже отсортирован

Пока ещё не отсортирован. Но даже если станет отсортирован:
Assasin писал(а):
если кому-то важен оригинальный порядок, просто сделает новый массив по событию onFilter


Galkov писал(а):
И, конечно же, во многом разумность теряется, если не сделать аналогичное для Integer и Real.

Вот сейчас этим и занимаюсь. Правда, перед НГ времени мало, но идём к цели!

Всем хороших праздников.

карма: 7
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)