Итак, MathParserEx, в чем его особенности:
- Полностью копирует функционал MathParser
- Построен на технологии компиляции в байт-код и его последующего исполнения своей стековой ВМ, что делает его в разы быстрее MathParser.
Сначала компоненту подается на вход строка - выражение, которое он будет считать. Парсер разбирает это выражение и компилирует его в опкоды. После этого входная строка в общем-то и не нужна, программа уже есть в памяти.
В чем отличие от FastMathParser?
В FastMathParser происходит компиляция напрямую в коды процессора, что делает компонент непереносимым на другие архитектуры. Байт-код, который использует MathParserEx, не привязан к архитектуре процессора, поэтому компонент гораздо легче протируем на другие процессоры. Но, конечно же, за это приходится платить небольшим ухудшением производительности.
Что еще не реализовано?
На данный момент нет возможности при возникновении вычислительной ошибки узнать, в каком месте исходного выражения она произошла. Реализация этого может привести к падению производительности за счет того, что придется увеличить объем получаемого байт-кода (из-за вставки отладочной инфы), скорее всего будет сделано два режима работы компонента: debug (доступен просмотр позиций ошибок вычисления) и release (недоступен просмотр).
UPD: уже реализовано
Что я предлагаю?
Предлагаю вам потестировать этот компонент и проверить на ошибки (у меня он заработал сразу же после первой компиляции, что меня очень удивило Так что скорее всего какие-то подводные камни, которые я не заметил, есть). После тестов и доработки обработки ошибок заменить этим компонентом штатный MathParser (можно даже без смены названия, т.к. совместимость обещана полная). Другой вариант - оставить его отдельным компонентом и развивать далее.
Кстати, заметил одну интересную особенность: есть свойство ResultType, определяющее, будет ли целым результат. Но когда мы повторно используем результат через %0 в выражении, подставляется вещественный результат, что в итоге может привести к неожиданным результатам вычислений. Может, стоит пофиксить такое поведение?
P.S.: тестовая схема выдает у меня двукратный прирост производительности на компиляторе Delphi 4 и трехкратный на FPC 1.9.6.
P.P.S.: Компонент и тестовая схема приложены в архиве вот здесь внизу:
||
||
/