|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
Поиск в этой теме |
12.03.2015, 12:43 | #1 | |
Visual LISP: Почему перебор объектов в SelectionSet неактивного документа происходит очень медленно?
Регистрация: 12.03.2015
Сообщений: 9
|
||
Просмотров: 4329
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,846
|
Ну, во-первых, совсем необязательно создавать SelectionSet. Работать с неактивным документом можно по-разному (как пример: http://autolisp.ru/2010/04/08/procee...tive-document/). Во-вторых, я не вижу никакого резона ни в формировании набора, ни (тем более) в его выделении. В-третьих, можно выполнить и просто формирование vla-указателей на примитивы и к ним применить vla-CopyObjects.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 12.03.2015
Сообщений: 9
|
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,846
|
Как пример, допиливай сам:
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 12.03.2015
Сообщений: 9
|
А как быть с этим?
Цитата:
Может быть подскажешь как из набора без vlax-for или vlax-map-collection сделать saffearray для vla-copyobjects? Или какой-нибудь другой способ скопировать selectionset из одного чертежа в другой. Только чтобы без перебора. Последний раз редактировалось Shourick, 12.03.2015 в 15:30. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,846
|
Shourick, я практически гарантирую, что 90% потерь времени у тебя уходит на формирование набора. Можешь взять для интересу код отсюда и погоняй на предмет "что быстрее".
Чем фильтрация-то не устраивает? Быстро, дешево, сердито.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 12.03.2015
Сообщений: 9
|
Цитата:
Цитата:
Именно на перебор объектов в SelectionSet неактивного документа тратится колоссальное время. Вопрос изначально был как раз про это. Извини, если неясно выразился. Для справки у меня установлен AutoCAD 2014, вдруг такие проблемы только в нём? Для пущей чистоты эсперимента я немного изменил код и проверил время для активного и неактивного документов. Код:
Для активного документа: Перебор всех объектов: Перебор только отрезков: А вот для неактивного документа: Перебор всех объектов: Перебор только отрезков: Алексей, что по этому поводу можешь сказать? Пока нет решения с SelectionSet я сохраняю данные в список, и потом ищу только в списке, а обращение к другому документу происходит только если данные не найдены в списке. Последний раз редактировалось Shourick, 13.03.2015 в 08:24. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,846
|
Файл предоставь. И критерии отбора примитивов.
У меня достаточно много работы выполнялось и выполняется с неактивным документом, так что не могу сказать, что мои утверждения совсем уж беспочвенны.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,846
|
Добавлю: использовать cdate для оценки скорости выполнения кода - ИМХО не фонтан ни разу. Для примера:
Код:
Код:
Код:
Если идти через ObjectDBX, то ssget отправляется лесом. Сравниваем только функции vla-all, vla-all-lst, vla-lines: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 12.03.2015
Сообщений: 9
|
Алексей, в приведённых тобой тестах нет ни одного сравнения скорости перебора примитивов во всём чертеже и только в SelectionSet.
Постараюсь объяснить свой вопрос. Я не отлавливаю блох. Разница в скорости перебора 30000 и 1000 примитивов для активного чертежа в 8 раз (см. мои скриншоты) для меня является поводом для рассмотрения более быстрого метода. А разница работы метода для активного и неактивного чертежа в тысячи! раз послужила для меня поводом начать это обсуждение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,846
|
У меня разница не больше 4-5% (см.отчеты выполнения). Shourick, еще раз говорю - образец файла-источника, файла-получателя копий объектов и критерии выбора объектов в студию! Будет предмет обсуждения - будет и о чем говорить.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 12.03.2015
Сообщений: 9
|
Алексей, я весьма огорчён, что такой заслуженный товарищ не понимает забыл разницыу между (eval function) и (eval (function)).
Ты скорость работы функций всегда так проверяешь, или только для меня исключение сделал? Попробуй так: (BENCHMARK '((SSGET-ALL) (SSGET-LINES) (VLA-ALL) (VLA-ALL-LST) (VLA-LINES))) Может быть после этого ты меня наконец услышишь и поверишь? Кстати, и автор BENCHMARK рекомендует имя функций заключать в скобки. У меня результат получился вот такой: При следующем соотношении примитивов в чертеже: (SSGET-ALL) 39203 (SSGET-LINES) 1667 Скорость выбора и перебора оказалась вот такой (только в _main переменную boundary до 1 уменьши, а то результат до конца недели будешь ждать) : (BENCHMARK '((SSGET-ALL) (SSGET-LINES) (VLA-ALL) (VLA-ALL-LST) (VLA-LINES))) Elapsed milliseconds / relative speed for 32 iteration(s): (VLA-ALL)............16 / 4101.81 <fastest> (SSGET-LINES).......936 / 70.12 (SSGET-ALL)........1950 / 33.66 (VLA-ALL-LST)......3400 / 19.30 (VLA-LINES).......65629 / 1.00 <slowest> Вот результаты сравнения с использованием SelectionSet (переменную boundary вернул в 1000): (BENCHMARK '((iva1)(iva2))) Elapsed milliseconds / relative speed for 32 iteration(s): (IVA2)......1404 / 9.71 <fastest> (IVA1).....13634 / 1.00 <slowest> Результат вполне себе коррелируется. Сам файл: 1.dwg Может быть всё-таки перейдём к сути вопроса? Последний раз редактировалось Shourick, 13.03.2015 в 14:13. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,846
|
Тьфу, черт... Запарка, сорри.
Попробовал (немного изменив коды) пару моментов. Код:
Код:
Вариант в SelectionSet приходится исключать Код:
Можно было бы, конечно, добавить еще и вариант "сначала все получить, а потом через vl-remove-if вычистить ненужное", но его скорость совсем низкая. Здесь conn - список, содержащий точечную пару '("obj" .<Указатель на документ>) Код:
Я ответил на вопрос?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 12.03.2015
Сообщений: 9
|
Бывает...
Повторюсь. Вопрос был про замедление перебора объектов SelectionSet в неактивном чертеже. Ответа пока не прозвучало . В активном чертеже при существенной разнице общего количества объектов и объектов, подлежащих анализу, выигрыш от использования SelectionSet есть. Складывается ощущение, что AutoCAD обращается к SelectionSet неактивного чертежа через какой-то дополнительный интерфейс. У меня, например, иконка чертежа в трае начинает моргать. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,846
|
В порядке оффтопа.
Лично мне SelectionSet через ActiveX как-то не нравится. На интуитивном уровне. В принципе можно написать проверку: если передаваемый указатель эквивалентен текущему чертежу, использовать SelectionSet, в противном случае - использовать другие методы.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разработка ПОС, искусство проектирования | Tyhig | Технология и организация строительства | 117 | 25.11.2021 17:38 |
Аттестация в Минрегионе по негосударственной экспертизе | Людмила Охр | Прочее. Архитектура и строительство | 350 | 14.02.2015 17:50 |