Версия для печати


Парсер математических выражений 2
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1448

Юрий Писарев
дата публикации 04-05-2014 09:32

Представляю вашему вниманию обновленный пакет компонентов для расчета математических формул.

Новые версии компонентов предназначены для Delphi 5, Delphi 6, Delphi 7, Delphi 2005, Delphi 2006, Delphi 2007, Delphi 2009, Delphi 2010, Delphi XE, Delphi XE2, Delphi XE3, Delphi XE4, Delphi XE5.

В архиве содержатся компоненты для указанных версий Delphi, а еще — примеры, которые не требуют установки компонентов. Просто открывайте файл проекта и запускайте его.

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

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

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

Если требуется вычислить значение формулы, которая есть в кэше, то, соответственно, берется уже существующий байт-код и не тратится время впустую на повторное преобразование формулы.

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

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

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

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

Все процессы, описанные выше, можно отключить: Parser.Cached := False; В этом случае парсер будет переводить формулу в байт-код каждый раз, когда требуется вычислить ее значение.



К материалу прилагаются файлы: