Производительность выражений

Поскольку SberMobile во многом основан на выражениях, расчет влияния их производительности критичен для планирования производительности всей инсталляции SberMobile.

Влияние загрузки процессора

Некоторые общие замечания по производительности выражения:

  • Если выражение ссылается на переменные, функции или контексты, расположенные на локальном сервере, время его расчета будет зависеть только от времени, необходимого локальному серверу для завершения операции. Оно может отличаться в тысячу раз в зависимости от алгоритма чтения переменной и кода реализации функции. Чтение локальной переменной контекста или вызов локальной функции контекста также могут вызвать значительную нагрузку процессора на локальном сервере.
  • Если выражение ссылается на переменные или функции удаленных контекстов (например, контекстов на удаленных серверах), его расчет занимает значительное время и может вызывать нагрузку процессора удаленного сервера. Время, необходимое для расчерта выражения, включающего ссылку на удаленный контекст, является суммой:
    • Кругового времени сети, необходимого для отправки команды (т.е. получения/установки переменной или команды вызова функции) на удаленный сервер и получения ответа (обычно приравнивается результату команды ping)
    • Времени, необходимого удаленному серверу для обработки команды.
  • Во всех других случаях обработка выражения происходит очень быстро и не имеет значительного влияния на нагрузку процессора. Миллионы подсчетов в секунду легко осуществляются любым сервером.

Следующая таблица помогает оценить влияние различных элементов выражения:

Элемент

Производительность

Основные операции (арифметические, сравнительные, логические, условные и т.д.)

Очень высокая. Влияние производительности (загрузки процессора) можно заметить, если выражение рассчитывается миллионы раз в секунду.

Ссылки на таблицу по умолчанию (например, {field} или {temperature[2]})

Очень высокая, миллионы операций в секунду не вызовут снижения производительности.

Ссылки контекста (например, {.:temperature$celsius} или {:executeQuery("SELECT * from users.*:info")})

Очень высокая или низкая в зависимости от расположения контекста (локального или удаленного) и типа переменной/функции контекста.

Производительность разрешения ссылок переменных/функций сервера зависит от:

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

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

Ссылки на компоненты виджета (например, {form/textField1:text})

Высокая, десятки тысяч операций в секунду не вызовут снижения производительности.

Математические функции

Очень высокая, миллионы операций в секунду не вызовут снижения производительности.

Функции обработки строки

Очень высокая или высокая. Влияние на производительность заметно только при выполнении операций с очень длинными строками (миллионы символов).

Функции обработки даты/времени

Очень высокая, миллионы операций в секунду не вызовут снижения производительности.

Функции обработки цвета

Очень высокая, миллионы операций в секунду не вызовут снижения производительности.

Функции обработки таблицы данных

Очень высокая или средняя, только операции с очень большими таблицами (тысячи записей) могут оказывать значительное влияние на загрузку процессора.

Функции конвертации типов

Очень высокая, миллионы операций в секунду не вызовут снижения производительности.

Функции контекста

Очень высокая или низкая, в зависимости от расположения контекста (локального или удаленного) и типа переменной/функции контекста.

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

Влияние использования памяти

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

Выражения в распределенной среде

Производительность вычисления выражения в распределенной среде может сильно зависеть от структуры выражения, поэтому архитекторы системы должны обращать внимание на возможность ухудшения производительности. В качестве примера проанализируем выражение, которое используется как часть привязки виджета:

addColumns({users.admin.devices.userProvider:userTable}, "<attachedValue><S>", "callFunction('users.admin.devices.userProvider', 'getUserInformation', {columnOfUserTable}")

Обычно это выражение вычисляется на сетевом хосте, где запущен SberMobile IIoT Platform Client или другой пользовательский интерфейс SberMobile Server. Число сетевых запросов, необходимых для вычисления выражения, будет равняться 1 + Number_of_records_in_userTable, так как отдельный удаленный запрос потребуется для каждого вызова функции getUserInformation(). Таким образом, если сетевая задержка (время ответа) составляет 1 секунду, а userTable содержит 1000 записей, вычисление выражения займет примерно 1000 секунд, что, скорее всего, недопустимо.

Для решения такой проблемы необходимо "перенести" точку вычисления выражения на другую сторону соединения, т.е. на сторону SberMobile Server. Сделать это можно многими способами. Например, на сервере можно создать отдельную модель User Provider с функцией getExtendedUserTable() типа Выражение. Приведенное выше выражение должно использоваться в параметрах данной функции, а само выражение привязки виджета будет лишь ссылаться на эту функцию, например: {users.admin.models.userProvider:getExtendedUserTable()}. В этом случае модель на стороне сервера будет осуществлять вычисление без сетевых вызовов для каждой записи, а выражение привязки будет делать лишь один удаленный вызов для получения предварительно созданной таблицы с сервера. Время вычисления выражения сократится примерно до 1 секунды, т.е. в 1000 раз.