Высокоэффективная альтернатива Objective C для оператора Switch для объектов - PullRequest
2 голосов
/ 17 ноября 2011

У меня есть функция, которую я хотел бы принять в аргументах NSString и int, а затем использовать оператор switch, чтобы вернуть вычисленное значение, например, умножить int на некоторую константу, в зависимости от того, что указано в NSString.

Очевидно, что оператор switch не работает для объектов в Objective-C. Так какая же самая быстрая альтернатива? Это заявления if-else? Или есть более элегантный метод?

EDIT

Причина, по которой я беспокоюсь о производительности, заключается в том, что я изменяю элементы пользовательского интерфейса, которые пользователь видит как конечный результат этих вычислений, и я не хочу, чтобы это казалось вялым.

Ответы [ 2 ]

15 голосов
/ 17 ноября 2011

Не оптимизируйте преждевременно.Просто создайте NSDictionary, который сопоставляет каждую строку с ее множителем.Затем посмотрите, достаточно ли это быстро.

Если вам нужно выполнить другую операцию в зависимости от строки, сделайте каждое значение в словаре блоком, выполняющим соответствующую операцию.

3 голосов
/ 17 ноября 2011

Причина, по которой я беспокоюсь о производительности, заключается в том, что я изменяю элементы пользовательского интерфейса, которые пользователь видит как конечный результат этих вычислений, и я не хочу, чтобы это ощущалось вялым.

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

Графические операции вприложения огромные потребители процессорных циклов.На порядки больше циклов будет потребляться во время рисования в ответ на графическое изменение по сравнению, скажем, с вызовом objectForKey: и вызовом hash (что и подразумевается при поиске в словаре).

Измерьте производительность вашего приложения.Выясните, почему это вяло.Затем исправьте проблему.

Первым шагом будет использование инструмента выборки ЦП, чтобы увидеть, куда идут эти циклы.

Если это не поможет, используйте один из различных графических эффектов.инструменты анализа, чтобы определить, не является ли это вашим узким местом.

Также легко может случиться так, что вы делаете что-то несколько раз, что нужно сделать только один раз;может быть, ваш код отслеживания взаимодействия с пользователем заставляет пользовательский интерфейс многократно перестраиваться, когда это нужно сделать только один раз (я только что исправил именно такую ​​проблему с производительностью в приложении, над которым я работаю).

...