Текущее время: Вс, июл 27 2025, 16:31

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Изменение строки в середине таблицы: вопрос производительности
СообщениеДобавлено: Чт, июн 27 2013, 15:22 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, окт 22 2009, 12:41
Сообщения: 473
Вопрос из разряда "спичек" (хотя...):
Что будет происходить при изменении размера строки, которая находится в середине таблицы?
Например есть таблица:
Code:
data:
  begin of ls_line,
    field1 type c,
    field2 type c,
    table  type table of c initial size 10,
  end of ls_line,
  lt_line like table of ls_line.
После обработки в lt_line 200 строк, в строке 100 поле table состоит из 10 строк. Увеличиваем размер строки 100:
Code:
read lt_line assigning <ls_line> index 100.
append 't' to <ls_line>-table.
Фрагмент памяти, который занимала раньше строка 100 будет освобожден, а вместо этого будет занят новый фрагмент где-то за пределами таблицы? Это сильно просаживает производительность?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение строки в середине таблицы: вопрос производительности
СообщениеДобавлено: Пт, июн 28 2013, 04:12 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Это никак не должно просаживать производительность. Скорее всего, на нижнем уровне, table мэппится на что-то типа Vector<String> (извините за мой С++ :) или на подобный С-аналог. Т.е. по сравнению с append к простой таблице, такой append к таблице в таблице должен выполняться с той же скоростью.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Изменение строки в середине таблицы: вопрос производительности
СообщениеДобавлено: Пт, июн 28 2013, 07:38 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Судя по всему, какие-то проблемы есть. Как минимум, при хранении не инициализированного объекта и начальной инициализации. В новых версиях для устранения таких проблем появились boxed components. Думаю, что проблемы должны возникать при больших объемах данных.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение строки в середине таблицы: вопрос производительности
СообщениеДобавлено: Пт, июн 28 2013, 12:40 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
table type table of c initial size 10, - тут скорее всего pointer, держите себя в руках


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Изменение строки в середине таблицы: вопрос производительности
СообщениеДобавлено: Пт, июн 28 2013, 14:20 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, окт 22 2009, 12:41
Сообщения: 473
В общем попробовал потестировать. Сложилось впечатление, что initial size не имеет смысла - влияния на результаты не увидел.
А вот с изменением строк по другому. Если после первоначального заполнения таблицы увеличивать <ls_line>-table несколько раз, то первое увеличение занимет в 1,5 - 2 раза больше времени чем последующие. Вне зависимости от соотношения initial size и первоначального заполнения таблицы. Думаю, может при первоначальном заполнении система создает размеры без запаса, после первого увеличения уже делает добавление к таблице с запасом. Ну последущие увеличения обходятся уже дешевле.
Версия системы 7.02 (Linux x64).

Кодер, спасибо за boxed components, не знал.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Изменение строки в середине таблицы: вопрос производительности
СообщениеДобавлено: Пн, июл 01 2013, 04:53 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Попробуйте initial size в районе 10000 или больше. И добавлять соответственно 10000 записей в таблицу. Будет ли какое-то отличие с таблицей без initial size?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Изменение строки в середине таблицы: вопрос производительности
СообщениеДобавлено: Пн, июл 01 2013, 07:08 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 351
weise написал(а):
Сложилось впечатление, что initial size не имеет смысла - влияния на результаты не увидел.
Внутренние таблицы (ВТ) хранятся в памяти постранично. INITIAL SIZE служит для указания информации о размере (=количества строк на) 1-й страницы. Если размер 1-й страницы не указан, он расчитывается автоматически.

weise написал(а):
А вот с изменением строк по другому. Если после первоначального заполнения таблицы увеличивать <ls_line>-table несколько раз, то первое увеличение занимет в 1,5 - 2 раза больше времени чем последующие. Вне зависимости от соотношения initial size и первоначального заполнения таблицы.
При объявлении ВТ в памяти создается только ссылка на таблицу. При добавлении в ВТ первой строки создается управлющая структура ВТ, заголовок ВТ и выделяются страницы под тело (строки) ВТ. В дальнейшем - либо заполняются существующие страницы, либо добавляются новые.

weise написал(а):
Фрагмент памяти, который занимала раньше строка 100 будет освобожден, а вместо этого будет занят новый фрагмент где-то за пределами таблицы?
Насколько я понимаю, lt_line хранит только ссылку таблицу table, а сама таблица где-то рядом :). Имхо, строка 100 вообще не поменяется, а в последнюю страницу, занимаемую table, будут добавлены данные еще 1 строки (если текущая страница имеет меньший размер, чем добавляемая строка, будет выделена новая страница).


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB