В МойОфис мы регулярно прислушиваемся к пользователям и совершенствуем продукты с учётом их мнения. Речь не только о пожеланиях, которые мы напрямую получаем от коммерческих заказчиков: не менее внимательно мы анализируем и отзывы хабрасообщества.

В одном из хабр-постов автор @Coffe4wolfрассказал о своем опыте работы с приложением «МойОфис Таблица». Критические замечания относились, по большей части, к производительности решения: например, скорости открытия «тяжёлых» документов и высокому потреблению оперативной памяти при работе с ними.

С момента публикации этой статьи мы основательно улучшили продукт. Уже в релизе 2.3, который вышел в начале этого года, работать в «МойОфис Таблица» стало гораздо комфортнее: открытие документов с большим количеством формул ускорилось на 66%, а потребление «оперативки» снизилось в среднем на 43%. Но это далеко не предел! Мы продолжаем оптимизировать приложение, и сегодня расскажем о том, чего добились в свежем релизе 2.7. Забегая вперед: теперь массивные документы с некоторыми популярными формулами открываются в нашем продукте в 20-50 раз быстрее, чем в предыдущей версии 2.6. А пересчёт формул при изменении содержания таблиц ускорился до 100 раз.

Об усовершенствовании работы с диапазонами и алгоритма действия формул в «МойОфис Таблица» читайте под катом.


С технической точки зрения на скорость работы с «тяжёлыми» файлами, содержащими формулы, в «МойОфис Таблица» влияли две основные проблемы.

Вот как мы справились с ними в релизе 2.7.

1. Проблема с диапазонами

Эта проблема касалась следующих функций с заданным критерием:

  • COUNTIF (подсчитывает количество ячеек в диапазоне, которые соответствуют одному указанному пользователем критерию)

  • SUMIF (находит сумму содержимого ячеек, соответствующих определенному условию)

  • AVERAGEIF (возвращает среднее значение диапазона на основании критериев)

  • MINIFS (возвращает минимальное значение в диапазоне ячеек, отфильтрованных по заданным критериям)

  • MAXIFS (возвращает максимальное значение в диапазоне ячеек, отфильтрованных по заданным критериям)

  • COUNTBLANK (подсчитывает количество пустых ячеек в заданном диапазоне)

При использовании этих функций пользователи, как правило, задают число строк с запасом — до предельно допустимого значения в 1048576. Учитывая, что всего на листе может содержаться порядка 17 миллиардов ячеек, покрытие формулой всего заданного диапазона приводило к медленному открытию документа. Пересчет формул при внесении изменений в содержание таблицы также приводил к резкому падению производительности: например, в продукте версии 2.2 этот процесс мог занимать несколько минут.

Решение

Для оптимизации нам потребовалось произвести обрезку диапазонов.

Упомянутые функции в «МойОфис Таблица» изначально были реализованы «в лоб»: совершался обход всего диапазона, который пользователь передавал в формулу, независимо от реального размера таблицы и наличия данных. Очевидно, что такой алгоритм избыточен — на практике достаточно совершить обход только ячеек с данными. Пустые же ячейки при необходимости можно обработать за одну операцию.

Например, так работает функция COUNTBLANK: вместо того, чтобы бегать по всему заданному диапазону и считать пустые ячейки, можно за константное время вычислить размер всего исходного диапазона, а затем вычесть из него количество ячеек с данными.

Технически оптимизация была реализована путем использования другого типа итератора по таблице и сопутствующего этому рефакторинга.

Результат

В ряде тестов зафиксировано ускорение открытия пользовательских файлов до 50 раз по сравнению с предыдущей версией продукта (2.6). Пересчет формул при изменении данных таблиц стал быстрее до 60 раз*.

*Конкретные показатели зависят от объёма документа и его содержания.

Пример тестирования

Тестирование проводилось на стационарном компьютере следующей конфигурации:

  • CPU — 12th Gen Intel(R) Core(TM) i7-1255U, 1.70 GHz

  • RAM — 16,0 ГБ

Тестовый файл — «Пустые диапазоны», содержащий на одном листе 6250 ячеек, формулы COUNTIF, COUNTIFS, AVERAGEIF, MAXIFS и SUMIF. Скачать его можно здесь.

Результаты теста

Продукт

Время открытия файла

Время пересчёта формул

«МойОфис Таблица» 2.6

73 с

47 с

«МойОфис Таблица» 2.7

3 с

1.5 с

2. Проблема с алгоритмом поиска

Вторая проблема «МойОфис Таблица» относилась к функциям VLOOKUP и HLOOKUP. Здесь, помимо обрезки диапазонов, требовалось еще и оптимизировать алгоритм поиска. В предыдущих версиях продукта использовался линейный поиск: при поиске определённого типа данных (например, числа или строки) функция проходилась по всему заданному диапазону ячеек.

Анализ пользовательских файлов, где используются функции VLOOKUP/HLOOKUP, показывает, что поиск осуществляется, как правило, по одним и тем же диапазонам. Кроме того, пользователи склонны задавать диапазоны с большим запасом на будущее. При прямолинейном подходе два этих обстоятельства выливаются в серьёзную проблему производительности — при работе с тысячами вызовов поисковых функций и диапазонами для поиска в тысячи и миллионы ячеек.

Решение

В 2.7 реализация функций VLOOKUP/HLOOKUP была переписана с линейного алгоритма поиска на использование поисковых индексов. Данные функции в «МойОфис Таблица» умеют работать в разных режимах: поиск точного соответствия значению, поиск ближайшего значения, поиск паттерна, и с разными типами данных — числа, сроки, булевые значения. Для каждой ситуации лучше подходит тот или иной тип индекса. Например, при поиске ближайшего числа удобно использовать бинарное дерево поиска, для поиска точного соответствия строке можно взять хэш-таблицу, а при индексировании булевых значений достаточно запомнить координаты всего двух ячеек, где впервые встречаются TRUE либо FALSE. Поэтому в «МойОфис Таблица» была реализована целая группа поисковых индексов, которые покрывают все возможные варианты поиска. Более того, индексы по возможности группируются по типу данных. Таким образом, например, при поиске числа более не нужно проверять ячейки со строками, что даёт дополнительный прирост производительности.

Изначальная линейная реализация функций поиска также сильно страдала от вышеописанной проблемы с избыточными диапазонами. Использование поисковых индексов исключает данную проблему, так как обход диапазона происходит только один раз за сессию вычислений — при построении индекса. Само же построение индекса также происходит с учетом того факта, что диапазон может быть задан с большим запасом, поэтому читаются только ячейки, содержащие данные, и первая ячейка вне диапазона данных, а остальные ячейки игнорируются.

Результат

В ряде тестов зафиксировано ускорение открытия пользовательских файлов до 40 раз по сравнению с предыдущей версией продукта (2.6). Пересчёт формул при изменении данных таблиц стал быстрее до 100 раз*.

*Конкретные показатели зависят от объема документа и его содержания.

Пример теста

Тестирование проводилось на стационарном компьютере следующей конфигурации:

  • CPU — 12th Gen Intel(R) Core(TM) i7-1255U, 1.70 GHz

  • RAM — 16,0 ГБ

Тестовый файл — «ВПР 30 000 строк», содержащий суммарно 149 019 ячеек на двух листах и 29673 функций VLOOKUP, каждая из которых производит поиск по 30000 ячеек. Скачать его можно здесь.

Результаты теста

Продукт

Время открытия файла

Время пересчёта формул

«МойОфис Таблица» 2.6

90 с

94 с

«МойОфис Таблица» 2.7

3.4 с

1 с

***

Вышеописанные действия — лишь часть большого пути по оптимизации нашего продукта для работы с крупными таблицами. Прирост производительности ожидается и в будущих релизах «МойОфис Таблица»; как правило, в год мы выпускаем 4 больших продуктовых обновления. Так, команда разработки уже тестирует оптимизации, которые приведут к двукратному ускорению навигации между ячейками, десятикратному ускорению открытия документов со сводными таблицами, ускорению фильтрации данных на 30% и вставки/удаления столбца из большой таблицы — более чем в 20 раз. Всё это появится в наших коммерческих продуктах в 2024 году.

Не забываем мы и о частных пользователях: уже этой зимой выйдет усовершенствованная «МойОфис Стандартный. Домашняя версия» с новой функциональностью. Подписывайтесь на наш хабр-блог и следите за новостями компании!

Комментарии (34)


  1. mgis
    20.12.2023 11:19

    Если что то ускорили в 50 и более раз, очевидно, что в коде до этого была лютая дичь.
    Если лютая дичь живет в коде столько лет сколько вашему проекту, то у меня для вас плохие новости).


    1. Demon416
      20.12.2023 11:19

      С одной стороны вполне обоснованный комментарии который я лайкнул бы будь у меня такая возможность, с другой стороны я неоднократно сталкивался с совсем неочевидными бутылочными горлышками производительности. Например отказ от динамической памяти в одной из программ дал ускорение на два порядка.


    1. fekrado
      20.12.2023 11:19

      Они как раз про это и говорят:

      функции в «МойОфис Таблица» изначально были реализованы «в лоб»


    1. bugy
      20.12.2023 11:19

      Термин premature optimization не спроста придуман. У почти любой оптимизации есть цена, и у многих оптимизаций нет необходимости (потому что к моменту, когда они станут узким местом, из могут переписать уже несколько раз из-за изменения бизнес требований или архитектуры).

      Более того, у молодого развивающегося продукта чаще всего больше потребность в новых фичах, чем масштабировании. Чтобы иметь возможность набрать новых клиентов.

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


      1. mgis
        20.12.2023 11:19

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

        p.s. А такая реакция скорее последовала на заголовок который мне показался слека пафосным.


      1. zaiats_2k
        20.12.2023 11:19

        Лишь бы пользователи не расхотели бы знакомиться с новыми фичами, столкнувшись с тормозами на ровном месте.


        1. ganzmavag
          20.12.2023 11:19

          В их случае пользователи, переходящие с других офисных пакетов, сильнее бы огорчились отсутствующим привычным функциям.


  1. GlebFF
    20.12.2023 11:19

    когда VBA макросы будут поддерживаться?


    1. myoffice_ru Автор
      20.12.2023 11:19

      VBA — проприетарная технология Microsoft, которую практически невозможно лицензировать, а значит, и использовать в других продуктах. Поэтому для работы с макрокомандами в редакторах МойОфис используется другой язык — Lua. Тем не менее, встроенный редактор макрокоманд в приложениях МойОфис позволяет распознать и отобразить код макроса на VBA, который содержится в документе формата DOCM/XLSM.


      1. FlashHaos
        20.12.2023 11:19

        Даешь python вместо lua. Желательно, с пандасом. Обгоните Microsoft на этом пути и сильно снизите порог вхождения.


        1. myoffice_ru Автор
          20.12.2023 11:19

          Здравствуйте! Спасибо за идею. А можете, пожалуйста, рассказать, в случае с какими задачами в «МойОфис Таблица» Python оказался бы для вас полезнее и функциональнее, чем Lua?


          1. 9982th
            20.12.2023 11:19

            Для человека, который знает Python и не знает Lua, первый будет полезнее второго буквально во всем. У Python относительно богатая стандартная библиотека, которая даже после обрезания того, что не лезет в формат макросов, будет функциональней Lua, не говоря уж о возможности встраивать сторонние библиотеки.


            1. iShrimp
              20.12.2023 11:19

              Есть pyspread - свободный аналог Excel с интерпретатором Python в каждой ячейке.

              Идея хорошая, но распространять свои таблицы будет... весьма затруднительно, поскольку программа позволяет писать в ячейки совершенно любой код, а контроль безопасности этого кода целиком возлагается на пользователя, открывшего файл.

              Не хватает чего-то типа белого списка разрешённых библиотек и функций, чтобы сделать принципиально невозможным создание вредоносного кода.


              1. Boilerplate
                20.12.2023 11:19

                Скорее тут будет как с оригинальным экселем. Есть безопасная версия без макросов, и есть версия с макросами, открываешь её - открываешь ящик Пандоры.


          1. Nyptus
            20.12.2023 11:19

            Да! На питоне уже разве что ленивый не пишет.


          1. Alanter
            20.12.2023 11:19

            Microsoft недавно объявили о скором завершении эпохи VBA и интеграции в O365 как раз Python-а. В вашем случае его интеграция вместо Lua позволит обеспечить совместимость еще до реализации этого самим Microsoft. Чем не killer-фича?


        1. ame0ba
          20.12.2023 11:19

          Скрипты на питоне уже есть в БЕСПЛАТНОМ СВОБОДНОМ И ОТКРЫТОМ LibreOffice.


      1. dm_2007
        20.12.2023 11:19

        А в каких "других продуктах" командой "Мой офис" планируется использовать язык Lua?

        На какие иные рынки рассчитывает "Мой офис", что так переживает за лицензионную чистоту?


        1. myoffice_ru Автор
          20.12.2023 11:19

          Спасибо за интересные вопросы! Мы работаем с полным соблюдением законодательства РФ и лицензирования. Возможность создания макрокоманд на Lua сейчас реализована в настольных редакторах МойОфис.

          Ряд наших продуктов пользуется спросом за пределами страны — настольные редакторы закупают страны Африки, мобильное приложение стало популярным в Латинской Америке, Squadus мы изначально выводим на рынок, как международный продукт.


  1. VadimDorofeev
    20.12.2023 11:19

    Раз уж в конце упомянули Домашнюю версию, то не планируется ли включить в её состав Презентацию? Не то чтобы она была часто нужна дома, но у Microsoft в домашние версии PowerPoint традиционно включался, поэтому в беседах с людьми иногда возникает этот вопрос.


    1. myoffice_ru Автор
      20.12.2023 11:19

      Здравствуйте! Сейчас мы активно развиваем и дорабатываем наш редактор презентаций. Пока это решение предоставляется только нашим корпоративным клиентам, однако мы планируем открыть доступ и для домашних пользователей.


  1. vadimk91
    20.12.2023 11:19

    Что что-то ускорили - это отлично.

    Есть некритичное пожелание - немножко посмотреть в сторону дизайна. Те же кнопки для жирного шрифта, курсива выглядят так, что их глифы рисовали по стандартам ЕСКД, после excel это прям-таки бросается в глаза.


  1. Helen_04
    20.12.2023 11:19

    Есть ряд вопросов к продукту. Один из самых наболевших: когда будет доработана функция автоматической адресации на ячейку (диапазон) при написании формул и самое странное- возможность адресации на другую книгу- чтобы данные можно было подтягивать из другого файла? Горячая клавиша f4?


    1. myoffice_ru Автор
      20.12.2023 11:19

      Спасибо за обратную связь! Возможность использования данных из других книг уже реализована в свежей версии 2.7 корпоративного редактора МойОфис (подробнее на стр.10 по ссылке), планируем добавить и в домашнюю версию в одном из будущих обновлений.

      По вопросу об автоматической адресации на ячейку (диапазон) при написании формул просим уточнить подробнее желаемый сценарий поведения. Правильно ли понимаем, что речь идет о создании абсолютных ссылок при помощи клавиши F4?


  1. Gorshok86
    20.12.2023 11:19

    до экселя еще далеко, но прогресс сам вижу, юзаю на работе ваш софт


  1. Viktor667
    20.12.2023 11:19

    Спасибо за блог! Есть ощущение, что вы реально развиваетесь и скоро все будет круто.

    Обновления звучат слишком красиво...

    Кажется, что "10 лет компании" - это какая-то маркетинговая уловка. Поэтому и кажется, что за 10 лет можно было сделать гораздо больше. Так что вы заложники этого тезиса.

    Однозначно лучше внедрить python в Мой Офис. Вместо или в дополнение к Lua. Просто копируйте всё хорошее из MS Office. А потом добавляйте что-то свое. И да, у них тоже внедряется python


    1. Robastik
      20.12.2023 11:19

      у них тоже внедряется python

      Вообще-то, питон в Excel можно было использовать всегда. Любые скриптовые языки подключаются в Excel с помощью MS ScriptControl.


      1. Viktor667
        20.12.2023 11:19

        Интересно. Никогда не слышал про практическое применение этой функции


        1. Robastik
          20.12.2023 11:19

          Пример практического применения - надстройка Excel на MS JScript.


  1. Stems
    20.12.2023 11:19

    В Экселе можно выделить диапазон, нажать CTRL+F и искать только по выделенному диапазону. У меня так в "Мой Офис" не получилось.


    1. myoffice_ru Автор
      20.12.2023 11:19

      Здравствуйте! Возможность поиска в выделенном диапазоне еще не реализована в МойОфис. Зафиксировали ваше пожелание для разработчиков, спасибо за обратную связь.


  1. jackcrane
    20.12.2023 11:19

    Тестирование проводилось на стационарном компьютере следующей конфигурации:

    CPU — 12th Gen Intel(R) Core(TM) i7-1255U, 1.70 GHz

    RAM — 16,0 ГБ

    глупости. компьютер для тестирования производительности д.быть намного более медленным, чтобы лучше была видна разница. я бы взял Intel Atom с поддержкой x86-64 либо аналогичные AMD. память не более 4 GB, а лучше 2 GB. HDD любой 7200 rpm. и это д.быть физический компьютер, не ВМ. далее взгоромоздить туда импортозамещенный сертифицированный линукс из реестра РФ ПО, "Мой офис" и вот это все.

    а потом поставить туда же минимальную актуальную винду (на сервер 2012r2 еще идут обновления), минимальный актуальный офис (2016), подрезать винде аппетиты (критерий: - netstat -an | grep -i LISTEN выдает только 135/tcp) и прогнать те же операции. под секундомер.

    желающие могут делать ставки - какой офис быстрее.

    ps: компьютер описанный мной следует выдавать вторым р.местом каждому тестировщику производительности.


    1. ganzmavag
      20.12.2023 11:19

      Вспоминается Opera, где за слабым компом релизы проверял кажется прям руководитель компании


    1. kterik
      20.12.2023 11:19

      Ну вообще да, поддерживаю. Офисные компы в принудительно импортозамещающихся государственных компаниях в массе своей гораздо ближе к конфигурации Celeron/4GB/HDD, уже есть и ещё долго будут, чем использованная в тесте мощная рабочая станция.

      Добавлю только, что сетевой доступ, если он нужен программе, тоже на тестовом компе должен быть ограничен полосой максимум 100 Мбит/с. А не 2,5 или 10 Гбит/с, как, я подозреваю, там использовано.