Я потонул около месяца полного времени в собственный синтаксический анализатор С++. Он работает, за исключением того, что он медленный (в 30-100 раз медленнее, чем жестко закодированное уравнение). Что я могу изменить, чтобы сделать это быстрее?
Я прочитал все, что мог найти на эффективном коде. В широких штрихах:
- Парсер преобразует выражение строкового уравнения в список объектов "операция".
- Объект операции имеет два указателя на функции: "getSource" и "оценить".
- Чтобы оценить уравнение, все, что я делаю, это цикл for в списке операций, вызывающий каждую функцию по очереди.
При вычислении уравнения не возникает ни одного if/switch. Все условные выражения обрабатываются парсером, когда он первоначально назначал указатели на функции.
- Я пробовал встраивать все функции, на которые указывает указатель на функцию - никаких улучшений.
- Помогло ли переключение с указателей функций на функторов?
- Как насчет удаления фрейма указателя на функцию и вместо этого создается полный набор производных классов "операций", каждый со своими собственными виртуальными функциями "getSource" и "оценка"? (Но разве это не просто перемещает указатели на функции в таблицу vtable?)
У меня много кода. Не уверен, что делать. Попросите какой-то аспект этого, и вы получите.