Для подсветки синтаксиса Google Prettify для языка Wolfram Language мне нужно сопоставить все идентификаторы с большим списком из примерно 7000 имен встроенных функций, чтобы выделить их в качестве ключевых слов.В прошлом я просто использовал регулярное выражение, состоящее из много чередований .Чтобы привести конкретный пример, здесь приведены все функции, которые начинаются с Plot
:
(:?Plot|Plot3D|Plot3Matrix|PlotDivision|PlotJoined|PlotLabel|PlotLabels|PlotLayout|PlotLegends|PlotMarkers|PlotPoints|PlotRange|PlotRangeClipping|PlotRangeClipPlanesStyle|PlotRangePadding|PlotRegion|PlotStyle|PlotTheme)
Теоретически это плохой выбор, поскольку для каждого альтернативного ключевого слова необходимо выполнять повторные совпадения.Что можно сделать, это построить Trie (или дерево префиксов) и построить из него регулярное выражение.Это пропустило бы все суб-совпадения, если префикс неверен.Для приведенных выше слов это выглядело бы так:
(:?Plot(?:3(?:D|Matrix)|Division|Joined|L(?:a(?:bel(?:s)?|yout)|egends)|Markers|Points|R(?:ange(?:Clip(?:PlanesStyle|ping)|Padding)?|egion)|Style|Theme)?)
Хотя это выглядит немного грязно, идея проста: он проверяет префикс Plot
и, если не совпадает, дальнейшее тестирование не требуется,Если он действительно совпадает, то он переходит во внутреннее выражение и проверяет следующие префиксы, пока не найдет полное совпадение или нет.
У меня есть регулярное выражение для всех 7000 ключевых слов, совпадающих с самим собой, и 7000 словарных слов как отрицательныхпримеры с Kotlin .Реализация Trie требует 78 мс, а регулярное выражение чередования - 523 мс.Это огромное улучшение, которое я ожидал.
Однако в JavaScript реализация Trie выглядит немного медленнее.В целях профилирования я установил 2 веб-страницы, которые вызывают механизм prettify двумя различными методами. Здесь - реализация Trie, а здесь - реализация чередования.Затем я использовал Chrome dev tools для профилирования, но у меня нет особого опыта работы с JS.
Вопросы:
- Может кто-нибудь объяснить, почему регулярное выражение Trieкажется медленнее, когда (а) само регулярное выражение меньше (хотя и сильно вложенное) и (б) регулярное выражение должно в теории делать много сочетаний клавиш при сопоставлении?
- Учитывая два теста-сайты или даже чистое регулярное выражение здесь и здесь , может кто-нибудь сказать мне, как правильно профилировать это?Список ключевых слов и диктовых слов доступен здесь .