Если бы вы проанализировали производительность этого кода, вы [весьма вероятно почти на 100% уверены] обнаружите, что сравнение строк - это то, что убивает вашу производительность.
Легкое решение - разделить анализ от оценки. То есть разберите выражение в промежуточную форму (например, на что намекают Джиллс и Руди, но проще), а затем оцените эту промежуточную форму.
То есть вы можете создать метод "parse:", который [рекурсивно] обходит ваше дерево узлов, анализирует каждый и затем устанавливает свойство для некоторого #, представляющего оператор.
typedef enum {
PlusOperator,
SinOperator,
..... etc ....
} OperatorID;
@property(nonatomic) OperatorID operatorID;
Тогда ваши evaluate:variable:
, если / еще, будут заменены оператором switch.
switch([node operatorID) {
case PlusOperator:
....
break;
... etc ...
Привет, спасибо большое. Но я уже проанализировал выражение и создал
дерево, которое я оцениваю с помощью метода выше. Что мне нужно, так это быстрее
оценка в цикле.
Не представлять дерево разбора в виде строк.
т.е. вместо _operator, возвращающего NSString, сделайте так, чтобы он возвращал int (или OperatorID, если используется вышеуказанное), а затем используйте оператор switch.
@property(nonatomic) OperatorID _operator;
Поскольку вы уже анализируете выражение, это должно быть еще проще / проще сделать.