Некоторое время назад зарубился с участником форума по поводу эффективности массивов и структур/соответствий в 1С. В процессе пришлось накидать тестовые сценариии для различных структур/операционных систем/платформ/клиентов. И, внезапно, была обнаружена ацкая просадка Соответствия в веб-клиенте. Пришлось копнуть эту субстанцию чуть глубже и обнаружилось, что:
Соответствие в веб-клиенте 1С реализовано через массив {key, value}[]
- Поиск по ключу занимает O(N)
Они тупо перебирают весь массив в поиске ключа - Вставка элемента занимает O(N):
Перед вставкой идут (линейно) по массиву, смотрят, что там нет нового значения и после этого наконец вставляют это новое в конец коллекции.
Для добавления N элементов в пустое Соответствие получится 1 + 2 + ... N = O(N²). Квадрат, Карл!
В древнючем Лиспе, который весь такой целиком из скобочек, hash tables вполне себе были каноническими O(1) на все операции, вставка N элементов была прямо пропорциональна N
Делаем пустую тестовую базу, вешаем куда-нибудь следующию код (я сделал пустой справочник и повесил кнопку в форму списка. просветите нуба, как сделать проще)
&НаКлиенте
Процедура НесоответствиеСоответствия(Команда)
Соответствие = Новый Соответствие();
Соответствие.Вставить("100500", 100500);
Соответствие.Вставить("100501", 100501);
Соответствие.Вставить("100502", 100502);
Соответствие.Вставить("100503", 100503);
КонецПроцедуры
Поднимаем локальный апач(тут можно отдельную статью запилить, как это правильно сделать, чтобы оно подтянуло локальную community лицензию))), запускаем это щастье в браузере.
Открываем dev tools -> debugger, открываем scripts/mod_main_mainform.js?sysver=8.3.25.1520, жмем "pretty print". Эта сцука, ессно, обфусцирована, некоторое время пришлось потратить на поиск сути. Там много интересного, но щаз речь о следующем:
Ищем ZS.prototype.Xd = function (a) {

Это прямо оно, то самое, которое делает Соответствие.Вставить(). Видим, что оно вызывает nvc(this, a)...
Ищем "function nvc(a, b) {".

Видим, что оно тупо идет в цикле по массиву(крайне криво идет, но это спишем на webpack) и ищет там ключ. Ставим breakpoint, жмем заветную кнопку.
Переходим на закладку Console, смотрим что там у нас в этом "a"

И таки да, это дикая дичь, которая хранит ключи и значения в массиве items. ЧТД, расходимся.
P.S. Для произвольной платформы поиск нужной обфусцированной функции такой:
запускаем поиск по "Вставить" в файле mod_main_loader.js?sysver=<тут будет ваша версия платформы>
оно даст несколько вхождений, дальше надо посмотреть глазами и понять, где речь про описание объекта Соответствие. Можно не вникать, а поставить брекпоинты вообще на всех найденных строках. Жмем кнопку "НесоответствиеСоответствия", проваливаемся в дебагер и вперед...
Есть ли у кого-то идеи, зачем оно так сделано в вебе, когда в js есть нативные объекты, которые суть hash tables?
Вступайте в нашу телеграмм-группу Инфостарт
