Это один из тех редких случаев, когда я бы посоветовал против профилирования.Я сразу предполагаю, что основная структура, которую вы используете, является реальным источником проблемы.Профилирование кода редко стоит много, пока вы не будете достаточно уверены, что базовая структура является разумной, и в основном нужно определить, какие части этой базовой структуры можно улучшить.Это не очень полезно, когда вам действительно нужно выбросить большую часть того, что у вас есть, и начать все сначала.
Я бы посоветовал преобразовать ввод в RPN.Чтобы выполнить это, единственная структура данных, которая вам нужна - это стекПо сути, когда вы получаете операнд, вы помещаете его в стек.Когда вы сталкиваетесь с оператором, он воздействует на предметы в верхней части стека.Когда вы закончите оценивать правильно сформированное выражение, у вас должен быть ровно один элемент в стеке, который является значением выражения.
Почти единственное, что обычно дает лучшую производительность, чем это.делать то, что советовал @Mike Dunlavey, и просто сгенерировать исходный код и запустить его через «настоящий» компилятор.Это, однако, довольно «тяжелое» решение.Если вам действительно нужна максимальная скорость, это, безусловно, лучшее решение - но если вы просто хотите улучшить то, что вы делаете сейчас, преобразование в RPN и интерпретацию, которые обычно дают довольно приличное улучшение скорости для небольшого количества кода.