Производительность - структуры в NSValue vs контейнерный объект
В ситуации, когда мне нужно сохранить все элементы данных в NSDictionary
имеет ли смысл ставить структуры (пользовательские типы или даже скаляры, т.е. CGPoint
) в моей собственной обертке (не NSValue
), поэтому я могу избежать накладных расходов на кодирование / декодирование каждый раз, когда получаю или устанавливаю элемент?
Для больших конструкций (16 поплавков) экономия значительна по IMO. Но даже с CGPoint
Я бы сэкономил 4 байта копирования плюс время кодирования / декодирования.
3 ответа
Почему бы просто не измерить это для вашего конкретного случая? Это единственный действительно надежный способ выяснить это.
Если оба варианта не достаточно, вы можете посмотреть в CFDictionary
с указателями на простые структуры, устанавливая значения обратного вызова соответственно или принять C++ std::map
/std::tr1::unordered_map
для вращения (если вы не против смешивания в C++, то есть).
На самом деле вы можете пойти еще дальше: полностью отказаться от структуры и сделать ее объектом модели. Затем вы можете интегрировать логику (например, вычисляемые свойства) в нее и дать ей возможность кодировать и декодировать себя в любых соответствующих форматах, а также помещать ее в коллекции.
Что ж, типы NSDictionary требуют объектов в качестве их членов в любом случае, поэтому вы не можете сохранить структуру в NSDictionary. Вы должны были бы обернуть это в контейнерный объект.