:: Игры Разума
Оптимизируй это!
Foxtrot
Автор

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
задача= удалить избыточное

a=""
b=""
GO TOP
SCAN
DO CASE
CASE EMPTY(a)
a = field1
CASE EMPTY(b)
b = field1
OTHERWISE
EXIT
ENDCASE
ENDSCAN
IF NOT EMPTY(a) AND NOT EMPTY(b)
DO MyProc
ENDIF


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Мало данных - ордер/фильтр на курсор, к примеру. Нужно ли значение переменных а и б где-то помимо этого кода (они же не local), нужно ли обращаться к курсору в вызываемой процедуре (соответствено нужно ли чтобы указатель записи стоял на следующей записи).

На первый взгляд логика тут простая - вызвать процедуру есть в таблице есть 2 непустых значения field1 (опять же, предполагая что в таблике нет полей с именами а и б, и что field1 это именно поле - что тоже абсолютно не очевидно из приведенного кода). Но не зная всего контекста что-то пытаться оптимизировать не особо получится - сломается другая логика.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
Foxtrot
Автор

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
напомнил:
- сколько будет дважды два?
- а мы покупаем или продаем?

LOCAL a,b
a=""
b=""
GO TOP
SCAN
DO CASE
CASE EMPTY(a)
a = "a"
CASE EMPTY(b)
b = "b"
OTHERWISE
EXIT
ENDCASE
ENDSCAN
IF NOT EMPTY(a) AND NOT EMPTY(b)
DO MyProc
ENDIF
записей в таблице больше двух

пысы. Игорь, предполагал, что ответят потомки, а не динозавры


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
PaulWist

Сообщений: 14614
Дата регистрации: 01.04.2004
А ну тогда

Skip 2

Do Myprog


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 17.07.19 14:23
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
Foxtrot
Автор

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
все же с field1 задачка выглядела получше. допустим, что это поле таблицы, в которой нет полей с именами а и b

LOCAL a,b
a=""
b=""
GO TOP
SCAN
DO CASE
CASE EMPTY(a)
a = field1
CASE EMPTY(b)
b = field1
OTHERWISE
EXIT
ENDCASE
ENDSCAN
IF NOT EMPTY(a) AND NOT EMPTY(b)
DO MyProc WITH a,b
ENDIF

пысы. афигеть. вроде простая задача, а тз...



Исправлено 4 раз(а). Последнее : Foxtrot, 19.07.19 07:22
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Ну, если сократить код, но просрать производительность на больших таблицах, то:
COUNT FOR !EMPTY(Field1) AND !DELETED() TO lnResult
IF lnResult >= 2
DO MyProc
ENDIF



Исправлено 1 раз(а). Последнее : pasha_usue, 17.07.19 21:43
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Для таблиц побольше:
lnResult = 0
SCAN FOR !EMPTY(Field1) AND !DELETED() AND lnResult < 2
lnResult = lnResult + 1
ENDSCAN
?lnResult
!DELETED() лучше выкинуть, если настройка SET DELETED гарантированна.



Исправлено 1 раз(а). Последнее : pasha_usue, 17.07.19 21:54
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Foxtrot
пысы. афигеть. вроде простая задача, а тз...
Без ответа на уточняющие вопросы можно будет предложить скрытое условие (или настройку) которая даст расхождение в результатах между начальным вариантом и очень многими из возможных предложенных. Или в том и суть - потыкать потом отвечающих в то что они то-то и это-то не учли

Когда оптимизируют код, хотя бы в общих чертах представляют для чего он нужен, какую функцию выполняет - тогда оптимизация будет эффективной, иначе...

Ну вот к примеру если этот код выполняется многократно (не единожды), и смысл его именно в проверке того что в таблице есть хотя бы 2 "непустых" записи, то мне кажется что оптимальнее всего будет
INDEX ON Field1 TAG Field1 FOR !EMPTY(Field1) && Это достаточно 1 раз сделать
SET ORDER TO Field1
LOCATE
IF !EOF()
SKIP 1
IF !EOF()
DO MyProc
ENDIF
ENDIF
Но уже одно то что этой самой MyProc нужен зачем-то доступ к записи следующей за 2-й непустой делает решение неподходящим.


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 17.07.19 22:48
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
Foxtrot
Автор

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
PaulWist
Skip 2
точнее 3

------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
PaulWist

Сообщений: 14614
Дата регистрации: 01.04.2004
Foxtrot
PaulWist
Skip 2
точнее 3

Skip 2 установит указатель на 3-ей записи, а skip 3 на 4-ой, по условию задачи scan пропускает первые две записи и на 3-ей запускает Myprog.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
Foxtrot
Автор

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
вооот! старею! обскипанулся таки
но переписывать код на практике все же накладно обычно, предлагаю просто удалить лишнее


------------------
Мойте ноги, моя ноги вы моете и руки




Исправлено 1 раз(а). Последнее : Foxtrot, 18.07.19 08:17
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
PaulWist

Сообщений: 14614
Дата регистрации: 01.04.2004
Foxtrot
вооот! старею!

Не расстраивайся, я сначала тоже написал skip 3


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
По условиям задачи (начальной, когда ещё не было a="a") скан дополнительно пропускает записи с пустым полем - скип без дополнительного фильтра по таблице, или фильтрующего индекса этого сделать не может (а С ними он не на ту запись станет в итоге). Кроме того, без фильтрующего индекса такие скипы могут быть весьма накладны - если к примеру в таблице под сотню Мб множество записей с пустым полем, а искомое "непустое" где-то очень далеко от начала.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
Foxtrot
Автор

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
все так, но ты имхо увлекся по мне так, если про фильтры, индексы ни слова, следовательно их и нет
требуется лишь скопировать код и удалить лишнее ;)


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Foxtrot
все так, но ты имхо увлекся по мне так, если про фильтры, индексы ни слова, следовательно их и нет
требуется лишь скопировать код и удалить лишнее ;)
На данный момент не представлено кода, который полностью выходит на результат исходного. А в условии не оговорено, чем можно пожертвовать.
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
Foxtrot
Автор

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
задачу составлял спонтанно, отсюда видимо столько вопросов
предполагал, что предложат к примеру очевидный вариант удалить строку "GO TOP", так как конманда SCAN по-дефолту использует операнд ALL
ну и дальше по тексту... есть там еще к чему стремиться
а так "да", спонтанное оно и есть спонтанное. просто тенденция сейчас - все мигрируют в облака, а у нас - в курилку
такие дела


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
medstrах

Сообщений: 1810
Дата регистрации: 10.06.2019
Foxtrot
ну и дальше по тексту... есть там еще к чему стремиться
Ну тогда к чему это тред был, если сам в курсе?
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
Foxtrot
Автор

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
то есть загадывая задачу, вопрошающий не должен знать ответа?
как тебя понимать, Саид? (с)


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Foxtrot
все так, но ты имхо увлекся по мне так, если про фильтры, индексы ни слова, следовательно их и нет
требуется лишь скопировать код и удалить лишнее ;)
О том и речь - ты не предоставил всех исходных данных, и потому понять как там "правильно" нереально.
"просто Skip 2" (к которому, кстати, нужно locate прописать ну или тот же go top, хотя он в общем случае медленнее работает) предполагает ну по минимуму что в таблице нет записей с пустым полем field1. В дополнение к уже озвученному допусловию что записей >2
А если ты ещё и "знаешь" что в таблице нет удалённых записей (или просто стоит set deleted off и они не отбрасываются), нет ни фильтров ни set order, и это не курсор с несохранёнными изменениями в 5-м режиме буферизации то, конечно же, гораздо более оптимальным (со всех сторон) будет простая команда GO 3.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Оптимизируй это!
Foxtrot
Автор

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
кстати с количеством я малость погорячился. количество записей никак не должно влиять на код


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 3 (Гостей: 3)

© 2000-2024 Fox Club 
Яндекс.Метрика