|
08.04.2011, 11:00 | #1 |
Участник
|
а точно ЛЮБОЕ изменение приводит к пересозданию контейнера? даже conpoke?
вопрос отсюда Как правильно хранить статичный набор начальных данных в классах?
Цитата:
Сообщение от CDR
Контейнер не может содержать в себе классы, т.к. сам не является классом.
Контейнер относится к value-типам (как str, int, real), а не к reference-типам (класс, запись). Следовательно структура контейнера создается в памяти только один раз при его инициализации. Последующие изменения содержимого контейнера реализованы, как создание нового контейнера и копирование значений из старого в новый. Отсюда крайне не рекомендуется использовать решения вроде заполнения контейнера в цикле. Но полезно использовать, например, для передачи параметров между клиентом и сервером. во-вторых, вопрос всем: а точно ЛЮБОЕ изменение приводит к пересозданию контейнера? даже conpoke? А как же класс KeySum, который активно раньше использовался, и поныне используется в локализованном функционале? как измерить в ax2009? вроде HeapChek не работает в ax2009. см. также контейнер: '+=' vs 'conins' небольшое исследование SmartHeap out of Memory при работе пакетного сервера |
|
08.04.2011, 12:42 | #2 |
MCTS
|
Точно-точно.
__________________
Dynamics AX Experience |
|
08.04.2011, 12:43 | #3 |
Мрачный тип
|
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
08.04.2011, 13:04 | #4 |
MCTS
|
Во, нашел в документации по DAX...
Цитата:
In X++, container is one of the primitive types, or value types. container is not a class. A container contains an ordered sequence of primitive values or other containers.
A container slightly resembles an array, or collections such as the List or Stack classes. However, you can never change the size or content of a container after the container is created. X++ statements that appear to modify a container are internally building a new container and copying values as necessary. Even an assignment of a container to another container variable creates a new copy of the container. All of this has performance implications. Containers are Immutable. Some X++ statements with containers might appear like they modify a container, but inside the system this never occurs. Instead, the data from the original container is combined with data from the command to build a new container. You create a new container every time that you call any of the following functions: conDel conIns conPoke The following statements all create a new container: myContainer = [1]; myContainer += [2]; myContainer4 = myContainer5; A container is best suited for processes that do not involve excessive modification to the size or contents of the container. When a container undergoes excessive additions of data, overall system performance can be decreased by the need to repeatedly copy container data and allocate new space. Контейнер - это value-тип. Контейнер не класс! Контейнер содержит последовательность value-типов или других контейнеров. Контейнер слегка напоминает классы List или Stack. Однако невозможно изменить размер или содержимое контейнера после его создания. Операторы X++, модифицирующие контейнер, внутри создают новый контейнер и копируют значения. Контейнеры относятся к immutable объектам. Каждый раз при использовании следующих функций создается новый контейнер: conDel conIns conPoke Следующие выражения также создают новый контейнер: myContainer = [1]; myContainer += [2]; myContainer4 = myContainer5;
__________________
Dynamics AX Experience |
|
|
За это сообщение автора поблагодарили: mazzy (15), Logger (3). |
08.04.2011, 12:55 | #5 |
Мрачный тип
|
Вообще-то я тоже считаю, что пересоздается, но прямых доказательств на руках нет. Чую, как говорится, сию бесовщину, но обосновать не могу ...
Контейнер по сути есть структурированная строка (с разделителями и типизаторами хранимых элементов) - а манипуляции с изменением размера строки (что происходит при вставке, удалении и иногда при перезаписи элемента контейнера) делаются гораздо проще путем создания нового буфера памяти, копирования туда с разными манипуляциями содержимого из старого и высвобождением старого буфера памяти. .
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
08.04.2011, 13:06 | #6 |
MCTS
|
Цитата:
Сообщение от mazzy
вопрос отсюда Как правильно хранить статичный набор начальных данных в классах?
А как же класс KeySum, который активно раньше использовался, и поныне используется в локализованном функционале?
__________________
Dynamics AX Experience |
|
08.04.2011, 13:21 | #7 |
MCTS
|
Кстати, по этому поводу в той же доке написано:
Цитата:
+= is Faster Than conIns
When you want to build a new container by appending new data, you can use either the += operator or the conIns function. The += operator is the faster alternative. Use the conIns function only when you want to add new data before the last index of the original data Когда надо добавить данные в контейнер, можно использовать оператор += или функцию conIns. Оператор работает быстрее. ConIns следует использовать только в случае вставки данных не в конец контейнера.
__________________
Dynamics AX Experience Последний раз редактировалось CDR; 08.04.2011 в 13:25. |
|
08.04.2011, 13:36 | #8 |
Moderator
|
Цитата:
Во вторых - насколько я помню, классы map,set,struct и array появились только в версии 2.5 (Возможно в версии 2.1), а классы которые я перечислил, появились гораздо раньше. А не переписали их, вероятно, просто потому что никто на производительность не жаловался.Да и все равно, в 90% случаев, 90% времени исполнения в Аксапте уходит на работу с БД, а не на интерпретацию кода и работу с памятью. Эдакое правило 90:90 |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Изменение размера картинки | 15 | |||
Изменение идентификаторов(id) полей | 30 | |||
SalesQuickQuote - разрешить изменение фильтра в форме | 6 | |||
Блокировка на изменение | 4 | |||
Закрыть изменение кода? | 11 |
|