for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Игры Разума
  

Оптимизируй это!
Foxtrot
Автор

Сообщений: 3403
Откуда: Куда:
Дата: 16.07.19 20:51:39
задача= удалить избыточное

  
  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


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
Igor Korolyov

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

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
Foxtrot
Автор

Сообщений: 3403
Откуда: Куда:
Дата: 17.07.19 14:04:59
напомнил:
- сколько будет дважды два?
- а мы покупаем или продаем?

  
  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
записей в таблице больше двух

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


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
PaulWist

Сообщений: 13456
Дата: 17.07.19 14:21:16
А ну тогда

Skip 2

Do Myprog


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




Исправлено: PaulWist, 17.07.19 14:23
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
Foxtrot
Автор

Сообщений: 3403
Откуда: Куда:
Дата: 17.07.19 20:25:51
все же с 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

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



Исправлено: Foxtrot, 19.07.19 07:22
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
pasha_usue

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



Исправлено: pasha_usue, 17.07.19 21:43
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
pasha_usue

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



Исправлено: pasha_usue, 17.07.19 21:54
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
Igor Korolyov

Сообщений: 33806
Дата: 17.07.19 22:47:54
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




Исправлено: Igor Korolyov, 17.07.19 22:48
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
Foxtrot
Автор

Сообщений: 3403
Откуда: Куда:
Дата: 18.07.19 05:39:42
PaulWist
Skip 2
точнее 3

------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
PaulWist

Сообщений: 13456
Дата: 18.07.19 08:11:54
Foxtrot
PaulWist
Skip 2
точнее 3

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


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

Re: Оптимизируй это!
Foxtrot
Автор

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


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите




Исправлено: Foxtrot, 18.07.19 08:17
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
PaulWist

Сообщений: 13456
Дата: 18.07.19 08:16:21
Foxtrot
вооот! старею!

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


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

Re: Оптимизируй это!
Igor Korolyov

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
Foxtrot
Автор

Сообщений: 3403
Откуда: Куда:
Дата: 19.07.19 05:59:31
все так, но ты имхо увлекся по мне так, если про фильтры, индексы ни слова, следовательно их и нет
требуется лишь скопировать код и удалить лишнее


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
pasha_usue

Сообщений: 3448
Откуда: Е-бург
Дата: 19.07.19 07:09:48
Foxtrot
все так, но ты имхо увлекся по мне так, если про фильтры, индексы ни слова, следовательно их и нет
требуется лишь скопировать код и удалить лишнее
На данный момент не представлено кода, который полностью выходит на результат исходного. А в условии не оговорено, чем можно пожертвовать.
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
Foxtrot
Автор

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


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
medstrах

Сообщений: 1810
Дата: 19.07.19 19:34:16
Foxtrot
ну и дальше по тексту... есть там еще к чему стремиться
Ну тогда к чему это тред был, если сам в курсе?
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
Foxtrot
Автор

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


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive

Re: Оптимизируй это!
Igor Korolyov

Сообщений: 33806
Дата: 19.07.19 22:38:54
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
Автор

Сообщений: 3403
Откуда: Куда:
Дата: 29.07.19 13:31:06
кстати с количеством я малость погорячился. количество записей никак не должно влиять на код


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive



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

On-line: 22 NSF  (Гостей: 21)

25.11.2020 13:38:31 exec: 0.33
Mem: 1.47 Mb

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