Эффективность синтаксического анализатора уравнений

Я потратил около месяца полной занятости на собственный синтаксический анализатор уравнений C ++. Он работает, за исключением того, что он медленный (в 30–100 раз медленнее, чем жестко запрограммированное уравнение). Что я могу изменить, чтобы ускорить работу?

Я прочитал все, что смог найти, об эффективном коде. В общих чертах:

  • Анализатор преобразует выражение строкового уравнения в список «операционных» объектов.
  • Объект операции имеет два указателя на функцию: «getSource» и «оценка».
  • Чтобы оценить уравнение, все, что я делаю, - это цикл for в списке операций, вызывающий каждую функцию по очереди.

При оценке уравнения не встречается ни одного переключателя if / - все условные выражения обрабатываются синтаксическим анализатором, когда он изначально назначал указатели на функции.

  • Я пробовал встраивать все функции, на которые указывают указатели функций, - без улучшений.
  • Поможет ли переключение с указателей функций на функторы?
  • Как насчет удаления структуры указателей функций и создания вместо этого полного набора производных классов «операций», каждый со своими собственными виртуальными функциями «getSource» и «оценивать»? (Но разве это не просто перемещает указатели функций в vtable?)

У меня много кода. Не уверен, что перегонять / размещать. Просите об этом, и вы получите.

11
задан Tim Cooper 20 September 2011 в 15:13
поделиться