Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

19 Март 2019, 04:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Как повысить производительность макроса  (Прочитано 1468 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sn_007
Участник
**
Offline Offline

Пол: Мужской
Расположение: Краснодар
Сообщений: 8

Never say never...


« Стартовое сообщение: 23 Декабрь 2015, 21:47 »

Коллеги, доброго времени суток!
Ещё нужна небольшая помощь.

Я написал макрос под OOo 3.0 на Бейсике.
Он отлично работает, но довольно медленно.

Суть в том, что примерно из 2500 ячеек вызывается моя макрос-функция, возвращающая число в ячейку.
Каждый такой вызов возвращает найденное в другом листе число из диапазона примерно 20000 ячеек.
В общем-то объём вполне разумный, ничего сверхъестественного - но на эту работу уходит суммарно более 3 секунд.
Можно ли что-то придумать, чтобы в несколько раз ускорить этот макрос.

Код даже присылать нет смысла: там в каждом вызове банально перелопачивается матрица из 20000 ячеек при помощи метода GetCellByPosition().
Может быть проблема именно в нём - нужно использовать какой-то более эффективный подход?

Заранее признателен, если кто-нибудь посоветует, как это улучшить!
« Последнее редактирование: 25 Декабрь 2015, 15:22 от sn_007 » Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 656


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 24 Декабрь 2015, 00:37 »

Суть в том, что примерно из 2500 ячеек вызывается моя макрос-функция, возвращающая число в ячейку.
Каждый такой вызов возвращает найденное в другом листе число из диапазона примерно 20000 ячеек.
В общем-то объём вполне разумный, ничего сверхъестественного - но на эту работу уходит суммарно более 3 секунд.
Три секунды на 20000 ячеек — это не так уж и медленно.
Код даже присылать нет смысла: там в каждом вызове банально перелопачивается матрица из 20000 ячеек при помощи метода GetCellByPosition().
Может быть проблема именно в нём - нужно использовать какой-то более эффективный подход?
Извлечение данных массивом и обработка массива быстрее чем поштучная обработка ячеек. Но это в общем, конкретно нужно смотреть на задачу (исходные данные и макрос)
Записан

sn_007
Участник
**
Offline Offline

Пол: Мужской
Расположение: Краснодар
Сообщений: 8

Never say never...


« Ответ #2: 24 Декабрь 2015, 09:27 »

Спасибо за быстрый отклик!

Я прикреплю файл с макросом.
Посмотрите, пожалуйста, что там можно принципиально улучшить...

* DetectActivity-2016 (v.2.0).ods (134.63 Кб - загружено 10 раз.)
Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 656


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #3: 24 Декабрь 2015, 18:31 »

Если говорить только о макросе, то в нём есть кое-что лишнее, например все строки кода trener_tasks = trener_tasks + 1 можно смело убрать слегка изменив концовку макроса, по-мелочам можно ещё кое-что изменить, но макрос в принципе не тормозит, тормоза в не оптимальном построении таблиц.

Я бы сократил объём планирования — не на год, а на два - три месяца (если можно), а так же предотвратил бы вычисления для пустых строк (без имён)
Записан

sn_007
Участник
**
Offline Offline

Пол: Мужской
Расположение: Краснодар
Сообщений: 8

Never say never...


« Ответ #4: 24 Декабрь 2015, 20:49 »

Спасибо большое! Отлично!
Хорошие мысли, обязательно ими воспользуюсь.

А как отметить эту тему как решённую?

Ещё раз спасибо, и успехов Вам!
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!