• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Ядро КОМПАС

Автор Lemieux, 01.01.25, 17:35:46

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Lemieux

Всех приветствую.
Кто-то разбирался с внутрянкой КОМПАС или ядром? Может кто-то общался с ТП по поводу API и примерно знает внутрянку.
Мне вот, что стало интересно. Я сейчас занимаюсь разработкой аналога КиЖ и, в данный момент, провожу НИОКР по алгоритму поиска кратчайшего пути. И для этого я строю виртуальный взвешенный граф и достаточно много преобразований происходит. И вот я задался вопросом, почему считывание информации из 50 объектов:
1. Чтение верхней сборки, из 10 компонентов, среди которых 5 мне нужных.
2. Чтение в этих 5 компонентов ещё по 8 компонентов.
происходит на порядок выше, чем примерно 100к операций над этими компонентами. ~1000 мс против ~100мс.

Это архитектура КОМПАС такое днище или я чего-то не понимаю? Просто для меня это всё странно. Вроде при чтении сборки КОМПАС раздал Reference всем объектам и хранит в оперативке фактически дерево, но такое ощущение, что идёт обращение к жёсткому диску.

Lemieux

Ещё интересный момент.
Имеется код. В нём реализовано 2 цикла, которые делают одно и то же - читают подсборку. Только одна реализация через foreach другая через for.

ЦитироватьIParts7 partsOfDuct = partOfTopPart.Parts;

                    foreach (IPart7 partOfPart in partsOfDuct)
                    {
                        if (partOfPart.Name.Contains("Точка"))
                        {
                            IModelContainer controlPointContainer = partOfPart as IModelContainer;
                            IPoint3D point = controlPointContainer.Points3D.Point3D;
                          Node node = new Node(point, NodeType.Intermediate, cableDuct, topPart);
                          cableDuctNodes.Add(node);
                          nodes.Add(node);
                       }
                    }

                    for (int i = 2; i < partsOfDuct.Count; i++)
                    {
                        IPart7 partOfPart = partsOfDuct.Part;
                        IModelContainer controlPointContainer = partOfPart as IModelContainer;
                        IPoint3D point = controlPointContainer.Points3D.Point3D;
                        Node node = new Node(point, NodeType.Intermediate, cableDuct, topPart);
                        cableDuctNodes.Add(node);
                        nodes.Add(node);
                    }


Первое наблюдение - реализация через for даёт прирост ~10%. Второе наблюдение - если сначала стоит foreach, то он выполняет за ~140мс, а for уже за ~30мс. Но если их поменять местами, то for выполняется за ~120мс, а foreach за ~35мс.
КОМПАС делает кэширование? Зачем?

Lemieux

Выяснились ещё особенности этой поделки. Параметрическая сборка, с 42 локальными деталями (2 детали тяжёлые 6 и 2 мб, ещё одна из которой сделан массив) весит 8 мб. При открытии в КОМПАС она в оперативке начинает занимать 400 мб, это кабель-канал, скрин ниже.
Сборка с пятью такими кабель-каналами занимает уже 2.2 ГБ. Ещё интересное наблюдение, что когда в головной сборке изменяется внешняя переменная вставленной подсборки, в данном случае кабель-канал, то создаётся скрытая локальная подсборка.
Короб.png
Прибор.png

Lemieux

Жаль, что я разговариваю сам с собой, хотя отцы КОМПАС могли бы меня ткнуть носом. Я не верю, что я один замечаю эти проблемы.

ainis

Цитата: Lemieux от 01.01.25, 18:16:54Ещё интересный момент.
Имеется код. В нём реализовано 2 цикла, которые делают одно и то же - читают подсборку. Только одна реализация через foreach другая через for.

Первое наблюдение - реализация через for даёт прирост ~10%. Второе наблюдение - если сначала стоит foreach, то он выполняет за ~140мс, а for уже за ~30мс. Но если их поменять местами, то for выполняется за ~120мс, а foreach за ~35мс.
КОМПАС делает кэширование? Зачем?

Внутренняя часть этих циклов у вас абсолютно одинакова?
В цикле for нет условия  if (partOfPart.Name.Contains("Точка")) и элементы просматриваются, начиная с третьего (int i = 2), а в цикле foreach считываются все элементы.
В цикле for не используется переменная i. Наверное, должно быть написано: IPart7 partOfPart = partsOfDuct.Part(i);?

Lemieux

Цитата: ainis от 03.01.25, 10:21:08В цикле for нет условия  if (partOfPart.Name.Contains("Точка")) и элементы просматриваются, начиная с третьего (int i = 2), а в цикле foreach считываются все элементы.
Всё верно, за счёт этого и достигается некоторое ускорение. Я заранее знаю структуру сборки, два первых компонента основание короба и крышка. Кстати, я даже с регулярными выражениями тестил поиск и они так не влияют на производительность как обращение к компонентам КОМПАС.

Цитата: ainis от 03.01.25, 10:21:08В цикле for не используется переменная i. Наверное, должно быть написано: IPart7 partOfPart = partsOfDuct.Part(i);?
Да, Вы правы, потерялось при форматировании текста.

ainis

Интересно бы попробовать сделать два одинаковых цикла for, исполняемых друг за другом, и замерить время выполнения каждого. А потом то же самое сделать уже с циклом foreach.

Lemieux

Цитата: ainis от 03.01.25, 15:50:43Интересно бы попробовать сделать два одинаковых цикла for, исполняемых друг за другом, и замерить время выполнения каждого. А потом то же самое сделать уже с циклом foreach.
Я и такой вариант делал. Поведение одинаковое.