Я потратил около месяца полной занятости на собственный синтаксический анализатор уравнений C ++. Он работает, за исключением того, что он медленный (в 30–100 раз медленнее, чем жестко запрограммированное уравнение). Что я могу изменить, чтобы ускорить работу?
Я прочитал все, что смог найти, об эффективном коде. В общих чертах:
- Анализатор преобразует выражение строкового уравнения в список «операционных» объектов.
- Объект операции имеет два указателя на функцию: «getSource» и «оценка».
- Чтобы оценить уравнение, все, что я делаю, - это цикл for в списке операций, вызывающий каждую функцию по очереди.
При оценке уравнения не встречается ни одного переключателя if / - все условные выражения обрабатываются синтаксическим анализатором, когда он изначально назначал указатели на функции.
- Я пробовал встраивать все функции, на которые указывают указатели функций, - без улучшений.
- Поможет ли переключение с указателей функций на функторы?
- Как насчет удаления структуры указателей функций и создания вместо этого полного набора производных классов «операций», каждый со своими собственными виртуальными функциями «getSource» и «оценивать»? (Но разве это не просто перемещает указатели функций в vtable?)
У меня много кода. Не уверен, что перегонять / размещать. Просите об этом, и вы получите.
задан Tim Cooper 20 September 2011 в 15:13
поделиться