SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Оптимизация цикла



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
stn
Участник
Участник



Joined: 18 Jan 2008
Posts: 31

PostPosted: Wed Mar 19, 2008 9:45 am    Post subject: Оптимизация цикла Reply with quote

Как оптимизировать следующий кусок кода, подсчитывающий выделенные строки? В таблицы может содержаться десятки тысяч строк.

LOOP AT table_input INTO wa_input WHERE f_chk = 'X'.
l_count = l_count + 1.
ENDLOOP.
Back to top
View user's profile Send private message
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Wed Mar 19, 2008 10:15 am    Post subject: Reply with quote

Ну... если вам чисто для подсчета, то можно применить TRANSPORTING NO FIELDS, это будет чуток пооптимизированней

LOOP AT table_input WHERE f_chk = 'X' TRANSPORTING NO FIELDS.
l_count = l_count + 1.
ENDLOOP.
Back to top
View user's profile Send private message Blog
John Doe
Модератор
Модератор


Age: 46
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Wed Mar 19, 2008 10:17 am    Post subject: Reply with quote

Code:
DATA: XLINE TYPE I.   
TABLE_INPUT_NEW[] = TABLE_INPUT[].
DELETE TABLE_INPUT_NEW WHERE F_CHK <> 'X'.
DESCRIBE TABLE TABLE_INPUT_NEW LINES XLINE.
Back to top
View user's profile Send private message Blog
stn
Участник
Участник



Joined: 18 Jan 2008
Posts: 31

PostPosted: Wed Mar 19, 2008 10:40 am    Post subject: Reply with quote

спасибо, подойдет!
Back to top
View user's profile Send private message
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Wed Mar 19, 2008 10:56 am    Post subject: Reply with quote

John Doe wrote:
Code:
DATA: XLINE TYPE I.   
TABLE_INPUT_NEW[] = TABLE_INPUT[].
DELETE TABLE_INPUT_NEW WHERE F_CHK <> 'X'.
DESCRIBE TABLE TABLE_INPUT_NEW LINES XLINE.

Насколько я понимаю - выигрыш тут только в размере и красоте кода, в скорости выиграть не получится. Внутри delete скорее всего будет неявный loop, плюс к этому добавляются затраты памяти на дополнительную таблицу.
Для полной уверенности нужно проверить через SE30
Back to top
View user's profile Send private message Blog
vga
Мастер
Мастер


Age: 180
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Wed Mar 19, 2008 11:23 am    Post subject: Reply with quote

Armann wrote:
Насколько я понимаю - выигрыш тут только в размере и красоте кода, в скорости выиграть не получится. Внутри delete скорее всего будет неявный loop, плюс к этому добавляются затраты памяти на дополнительную таблицу.
Для полной уверенности нужно проверить через SE30


Привет. Тут фишка в том, что abap - интерпретирующий язык и под каждую итерацию будет вызываться куча базисных функций, которых явно не видно.
В случае же с кодом от John Doe, фактически будет вызвано несколько быстрых C функций для копирования и удаления по областям памяти. В зависимости от количества строк в таблице, разница во времени будет заметно возрастать.

Что во втором примере явно не гуд, так это потребность хранить в памяти еще одну таблицу. Если таблица большая, можно словить дамп из-за нехватки памяти.

Было бы оптимальней, если в исходной таблице поле флага стояло первым, тогда вторую таблицу можно было бы делать не одинаковой структуры, а состоящей из одного поля С(1).

Все ИМХО.
Back to top
View user's profile Send private message Blog Visit poster's website
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Wed Mar 19, 2008 11:50 am    Post subject: Reply with quote

vga wrote:
Привет. Тут фишка в том, что abap - интерпретирующий язык и под каждую итерацию будет вызываться куча базисных функций, которых явно не видно.
В случае же с кодом от John Doe, фактически будет вызвано несколько быстрых C функций для копирования и удаления по областям памяти. В зависимости от количества строк в таблице, разница во времени будет заметно возрастать.

вот оно как блин Smile
Back to top
View user's profile Send private message Blog
mike1
Модератор
Модератор



Joined: 22 Nov 2007
Posts: 82

PostPosted: Wed Mar 19, 2008 2:39 pm    Post subject: Reply with quote

John Doe wrote:
Code:
DATA: XLINE TYPE I.   
TABLE_INPUT_NEW[] = TABLE_INPUT[].
DELETE TABLE_INPUT_NEW WHERE F_CHK <> 'X'.
DESCRIBE TABLE TABLE_INPUT_NEW LINES XLINE.

я бы добавил еще одну строчку:
free TABLE_INPUT_NEW[].
и заменил
DESCRIBE TABLE TABLE_INPUT_NEW LINES XLINE.
на
xline = lines( TABLE TABLE_INPUT_NEW ).
и работает на копейки быстрее и пальцами по клаве стучать меньше.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.