Структура и соответствие. Скорость поиска

22 января 2013

Файлы для загрузки:

Конфигурация с примером из статьи

Предисловие

"Ключ и значение"Платформа 1С:Предприятие 8.x позволяет работать с такими внутренними классами как "Структура" и "Соответствие". Подробнее о них Вы можете прочитать в синтаксис-помощнике, скажу лишь, что структура и соответствие представляют собой некоторый двумерный массив с колонками "Ключ" и "Значение". По первой колонке производится поиск, во второй колонке хранится значение, относящееся к ключу.

Сегодня в статье мы проведем эксперимент, по результатам которого проанализируем время поиска значения по ключу в соответствии и структуре.

Эксперимент. Условие

Условие эксперимента будет следующим: база данных содержит ~20000 элементов справочника "Товары". Мы будем создавать экземпляр структуры и соответствия, заполнять их элементами справочника и производить поиск в них по ключу, выбранному пользователем. 

При заполнении в качестве ключа будем использовать наименование элементов справочника для структуры и ссылку на элемент для соответствия. Предварительно очистим наименование от пробелов и знаков '-'. В качестве значения будем записывать значение реквизита "Артикул".

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

Форма, из которой запускаются тестовые команды, выглядят следующим образом:

Форма для проведения теста

Как мы видим, на форме присутствуют две команды "Поиск по структуре" и "Поиск по соответствию", каждая из которых запускает алгоритм заполнения и поиска для соответствующих экземпляров класса.

Реквизит "Товар для поиска" содержит ссылку на товар, для которого будет возвращено значение артикула.

На следующем скриншоте приведен алгоритм заполнения и поиска для структуры и соответствия:

Алгоритм заполнения структуры/соответствия и поиска по ним

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

Эксперимент. Тест

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

Включение замера производительности

Когда в отладке исполнение кода дойдет то нужной строки, необходимо включить замер производительности.

Включение замера производительности

Переход на следующую строку кодаПосле этого выполнить переход на следующую строку кода и остановить работу инструмента замера производительность нажав ту же кнопку.

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

Результаты теста приведены далее.

Эксперимент. Результаты

Напомню, что в тесте структура и соответствие заполняется приблизительно 20000 элементов. Поиск осуществляется по наименованию, очищенному от пробелов и тире. Полученная строка, соответственно, является ключом для структуры. В соответствии ключом является ссылка на элемент справочника "Товары". Значение поиска выбирается в форме.

Выполнив описанные выше шаги мы получаем следующие результаты:

Результаты замера производительности поиска по структуре и соответствию

Проведя серию тестов, результаты изменились незначительно. Время поиска для структуры было больше в среднем на 25%. Результаты эксперимента показали, что поиск по соответствию выполнялся быстрее. Могу лишь предполагать, что достичь этого удалось лишь потому, что в качестве ключа была ссылка на элемент.


Примечание: лишь в редких случаях результаты были идентичными. От чего это зависит мне не удалось точно выяснить.


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


В этом и заключается главное преимущество класса "Соответствие", позволяющее оптимизировать работу платформы с оперативной памятью.

Эксперимент №2: Оба ключа с типом "Строка"

По просьбе Евгения Мартыненкова провел еще один эксперимент, отличие которого в типе ключа для соответствия. Теперь в качестве ключа и в структуре и в соответствии используется строка. Признаюсь, что результат был неожиданным.

Чтобы результат эксперимента был более точным, в справочник "Товары" добавил чуть больше ста тысяч элементов. В прошлом эксперименте их было 20000. Принцип эксперимента остался прежним - с помощью штатного инструмента "Замер производительности" измеряется время поиска значения по ключу в структуре и в соответствии.

Почему результаты был неожиданным? Взгляните сами:

Результат при использованием ключей с типом "Строка"

Результат оказался диаметрально противоположным! Теперь время поиска по соответствию больше (!!!) в 2 раза. Проведя серию экспериментов результат изменился незначительно.

Тогда стала интересна скорость поиска по соответствию с числовым ключом по сравнению со структурой. Проведя аналогичный эксперимент, но уже с ключом соответствия типа "Число", получил следующие результат:

Результат при использованием ключей с типом "Число"

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

Таким образом, скорость поиска по соответствию напрямую зависит от используемого в ключе типа Больше всего системе нужно времени при поиске по строковому ключу, причем при равных условиях соответствие проигрывает структуре. Однако при использовании в ключе соответствия таких типов данных как "число" или "уникальный идентификатор" (ссылка), скорость поиска в ней всегда выше по сравнению со структурой. Точный ответ на вопрос: "Почему это работает так, а не иначе?" узнать не получится, поскольку платформа в этом случае является "черным ящиком".

 

 



comments powered by Disqus