Текущее время: Сб, июл 19 2025, 19:06

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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